-1

以下に示すように、渡す文字列に日付がある場合でも、null 日付を取得します。

汎用入力日付形式は「MM/dd/YYYY hh:mm a」です

NSString 入力 Date は次のいずれかになります: "12/1/2012" 、 "12/1/2012 01:43 am" 、 "01:43 am"

私が試している期待される出力は、入力文字列に存在する場合は日付を出力し、入力文字列に存在する場合は時間を出力する必要があるということです。

入力:-

 [self testDate:@"12/1/2012"]

コード:-

-(void) testDate:(NSString*) str{
    NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MM/dd/yyyy hh:mm a"];//My Generic Date Format
    self.dateTest=[formatter dateFromString:str];
    [self printDate:self.dateTest];
}


-(void) printSeparatedDateAndTime:(NSDate*) date{
    NSDateFormatter *dateF=[[NSDateFormatter alloc] init];
    [dateF setDateFormat:@"MM/dd/yyyy"];
    NSString *dateStr=[dateF stringFromDate:date];
    NSLog(@"Date= %@",dateStr);

    [dateF setDateFormat:@"hh:mm a"];
    NSString *timeStr=[dateF stringFromDate:date];
    NSLog(@"Time= %@",timeStr);
}

出力日:-

日付= (ヌル)

時間= (ヌル)

入力は任意の形式にすることができます。

入力
"2012 年 12 月 1 日"
出力 日付 = "2012 年 12 月 1 日" 時間 = null

input "12/1/2012 01:43 am"
output date="12/1/2012" time=01:43 am

input "01:43 am"
output date=null time="01:43 am"

ここで別の答えを得ることができますObjective-C String(yyyy-mm-dd) to NSDate。これは、日付形式の設定が間違っている場合の回答を指します。

私の場合、日付形式は正しいです。ただし、日付のみ、時間のみ、またはその両方が含まれる場合があります。文字列から日付と時刻を分離するには、ここでios4 を参照できます - 文字列から日付と時刻を 2 つの別々の文字列に分割しますが、チェック済みの回答または有効な回答がありません。

4

2 に答える 2

5

削除するhh:mm a と、形式は「MM/dd/yyyy」または「dd/MM/yyyy」のいずれかになります。

-(void) testDate:(NSString*) str{
    NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"dd/MM/yyyy"];
    self.dateTest=[formatter dateFromString:str];
    [self printDate:date];
}

printeDate:作成された日付には時間に関する情報がなく、時間と分を表示しようとしているため、期待どおりに機能しません。常に午前 12.00 と表示されます。

時間と分を表示したい場合は、それも入力文字列に含める必要があります。

編集: dateFormats は 3 つの形式にすることができるため、試行錯誤を行う必要があります。

-(void) testDate:(NSString*) str{

    NSArray *dateFormats = @[@"dd/MM/yyyy",@"hh:mm a",@"dd/MM/yyyy hh:mm a"];

    NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
    NSDate *date = nil;

    for (NSString *dateFormat in dateFormats) {
        [formatter setDateFormat:dateFormat];
        date = [formatter dateFromString:str];
        if (date) {
            break;
        }
    }

    [self printDate:date];
}

また

-(void) testDate:(NSString*) dateString
{
    NSDate *date = nil;
    NSError *error = nil;
    NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeDate
                                                               error:&error];
    NSArray *matches = [detector matchesInString:dateString
                                         options:0
                                           range:NSMakeRange(0, [dateString length])];
    for (NSTextCheckingResult *match in matches) {
        if (match.date) {
            date = match.date;
            break;
        }
    }

    [self printDate:date];
}

EDIT 2:データ/時間をゼロにする必要があるため。してみてください

typedef enum {
    ValidDateType = 0,
    ValidTimeType = 1,
    ValidDateTimeType =2
}ValidType;

- (void)testDate:(NSString*) dateString
{
    NSArray *dateFormats = @[@"dd/MM/yyyy",@"hh:mm a",@"dd/MM/yyyy hh:mm a"];

    NSDateFormatter *formatter=[[NSDateFormatter alloc] init];

    __block NSDate *date = nil;
    __block ValidType type = ValidDateType;

    [dateFormats enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSString *dateFormat = (NSString *)obj;
        [formatter setDateFormat:dateFormat];
        date = [formatter dateFromString:dateString];
        if (date) {
            type = idx;
            *stop = TRUE;
        }

    }];

    [self printDate:date validType:type];
}

- (void)printDate:(NSDate*) date validType:(ValidType)type
{
    NSDateFormatter *dateF=[[NSDateFormatter alloc] init];
    [dateF setDateFormat:@"MM/dd/yyyy"];
    NSString *dateStr=[dateF stringFromDate:date];


    [dateF setDateFormat:@"hh:mm a"];
    NSString *timeStr=[dateF stringFromDate:date];

    dateStr = (type == ValidTimeType)?nil:dateStr;
    timeStr = (type == ValidDateType)?nil:timeStr;

    NSLog(@"Time= %@",timeStr);
    NSLog(@"Date= %@",dateStr);

}
于 2013-04-22T12:47:45.257 に答える
1

time: を含むように日付形式を設定しましたMM/dd/yyyy hh:mm aが、 string: で時間を渡していません12/1/2012

hh:mm a日付形式から を削除するだけです:

-(void) testDate:(NSString*) str{
    NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MM/dd/yyyy"];
    self.dateTest = [formatter dateFromString:str];
   [self printDate:self.dateTest];
}

また、アメリカ以外のユーザーがいる場合に備えて、静的な日付形式を使用しないことをお勧めします。Apple はNSDateFormatterStyle、ユーザー/システムが選択した書式設定スタイルを簡単に使用できるようにするために追加しました。

-(void) printDate:(NSDate*) date{ 
    NSDateFormatter *dateF=[[NSDateFormatter alloc] init];
    dateF.dateStyle = NSDateFormatterMediumStyle;
    dateF.timeStyle = NSDateFormatterNoStyle;
    NSString *dateStr=[dateF stringFromDate:date];
    NSLog(@"Date= %@",dateStr);

    dateF.dateStyle = NSDateFormatterNoStyle;
    dateF.timeStyle = NSDateFormatterShortStyle;
    NSString *timeStr=[dateF stringFromDate:date];
    NSLog(@"Time= %@",timeStr);
}
于 2013-04-22T12:46:26.970 に答える