为什么我的NSDateFormatter在解析时返回nil?

时间:2010-03-08 08:30:45

标签: objective-c cocoa nsdateformatter

我的代码就像这样

NSString *tempDate = [NSString stringWithString:tempReviewData.pubDate];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterLongStyle];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateFormat:@"HH:mm a"];

NSDate *newDate = [dateFormatter dateFromString:tempReviewData.pubDate];

我的新日期在这一点上变得越来越不知道为什么

3 个答案:

答案 0 :(得分:1)

它似乎对我有用,但它取决于tempReviewData.pubDate的格式。

当我使用无效格式时,例如@"6:30 M",我也会得到null。

这是有效的:

NSString *tempDate = [NSString stringWithString:@"6:30 PM"];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterLongStyle];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateFormat:@"HH:mm a"];

NSDate * newDate = [dateFormatter dateFromString:tempDate];
NSString * str = [dateFormatter stringFromDate:[NSDate date]];
NSLog(@"date: %@", newDate);
NSLog(@"str: %@", str);

输出:

2010-03-08 22:36:57.904 x[4340:903] date: 1970-01-01 12:30:00 +1000
2010-03-08 22:36:57.905 x[4340:903] str: 22:36 PM

答案 1 :(得分:1)

NSDate *newDate = [dateFormatter dateFromString:tempReviewData.pubDate];

pubDate是返回NSString还是NSDate?

如果它返回一个字符串,那么你应该重命名该属性以清楚地表明该字符串。

如果它返回一个日期(NSDate),那么尝试将其解析为字符串将不起作用,因为它不是一个字符串;此外,您可以删除所有这些格式化程序代码,因为您已经拥有了之后的日期对象。

答案 2 :(得分:0)

似乎NSDateFormatter非常挑剔。

-(void)dateFormatterTests {
    NSDateFormatter *formatter;

    formatter = [[NSDateFormatter alloc] init];

#ifdef WORKS
    [formatter setDateFormat:@"yyyy-MM-dd"];
#elif defined(ALSO_WORKS)
    [formatter setDateFormat:@"yyyy MM dd"];
    [formatter setLenient:YES];
#else // DOESN'T WORK
    [formatter setDateFormat:@"yyyy MM dd"];
#endif

    // Works per comments above
    NSLog(@"dFS: %@", [formatter dateFromString:@"2010-01-13"]);  
    // Never works with any of the above formats
    NSLog(@"dFS: %@", [formatter dateFromString:@"2010-01-13 22:00"]); 

    [formatter release]; formatter = nil;
}