输入NSDate格式未知且单独的日期和时间时NSDate转换问题

时间:2013-04-22 12:43:39

标签: ios objective-c nsdate nsdateformatter

即使我传递的字符串具有如下所示的日期,我也会得到null日期: -

通用输入日期格式为“MM / dd / YYYY hh:mm a”

NSString输入日期可以是以下之一:“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);
}

输出日期: -

日期=(null)

时间=(null)

输入可以是任何格式,例如

输入
“2012年12月1日”
输出 日期=“2012年12月1日” 时间=空

输入 “12/1/2012 01:43 am”
输出 日期=“2012年12月1日” 时间= 01:43 am

输入 “01:43 am” 的输出 日期=空 时间=“01:43 am”

在这里可以得到不同的答案Objective-C String(yyyy-mm-dd) to NSDate。如果日期格式设置错误,则指的是答案。

在我的情况下,日期格式是正确的。但它可能只有日期,只有时间或两者兼而有之。 要将日期和时间与字符串分开,可在此处引用ios4 - splitting a date and time from a string into two separate strings,但它没有选中的答案或有效的答案。

2 个答案:

答案 0 :(得分: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 AM。

如果您想显示小时和分钟,则还需要在输入字符串中包含该内容。

编辑:由于dateFormats可以采用三种格式,因此您需要进行反复试验。

-(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];
}

OR

-(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];
}

编辑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);

}

答案 1 :(得分:1)

您将日期格式设置为包含时间:MM/dd/yyyy hh:mm a,但您没有随时随身携带字符串: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);
}