我使用的NSDateFormatter在模拟器中运行良好,但是当我在iPhone中运行它时,我得到一个零。我将日期硬编码以确定格式,但无论如何它都会失败。
NSString *strPubDate = @"Fri, 8 May 2009 08:08:35 GMT";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss Z"];
NSDate *myDate = [dateFormatter dateFromString:strPubDate];
我尝试在iPhone上使用不同的区域设置,语言等。知道出了什么问题吗?
答案 0 :(得分:9)
此代码似乎可以正常使用“GMT”标记。
NSString *strPubDate = @"Fri, 8 May 2009 08:08:35 GMT";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss zzzz"];
NSDate *myDate = [dateFormatter dateFromString:strPubDate];
RFC822 Date and Time specs使用了一些“区域”标记,我找到了正确的符号来解析“GMT”标记Format String for the iPhone NSDateFormatter
感谢您的帮助!
答案 1 :(得分:2)
如果您需要使用特定的日期格式,您可能需要“手动”解析它,而不是使用NSDateFormatter
。它的行为确实根据语言环境等而改变,并且有一些错误,特别是当你的字符串中有时区时。
话虽如此,找到问题的一个选择可能是使用getObjectValue:forString:range:error:
方法而不是dateFromString:
。这样你就得到一个NSError
对象(理论上)可以告诉你问题是什么。
NSDateFormatterBehavior10_4
行。 iPhone OS仅支持10.4+选项,但如果在模拟器中使用“旧”样式,则不会出现任何错误。
答案 2 :(得分:2)
我最近也遇到过这个问题(iOS5)。
我还需要设置NSDateFormatter
的区域设置以在设备上运行。
如果没有这个,[dateFormatServer dateFromString:dateServer]
将返回null。
NSString *dateServer = @"Fri, 8 May 2009 08:08:35 GMT";
NSDateFormatter *dateFormatServer = [[NSDateFormatter alloc] init];
[dateFormatServer setDateFormat:@"EEE, d MMM yyyy HH:mm:ss zzzz"];
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
[dateFormatServer setLocale:locale];
[locale release];
NSDate * date = [dateFormatServer dateFromString:dateServer];
答案 3 :(得分:1)
没有什么是突出的,但为了帮助调试这个,您可以尝试向NSDateFormatter提供一个日期对象,并查看结果字符串是否与您尝试解析的字符串有任何细微差别。
答案 4 :(得分:1)
当我在最后用“GMT”解析日期字符串时,我使用的是“zzz”格式,而不是“Z”。
答案 5 :(得分:0)
我的第二个Manuel Spuhler关于手动解析的建议 - 不是我最喜欢的选项,但Objective-C的选项太复杂了(缺少错误报告 - 任何错误只是吐出nil
,没有提示误差)。
对我有用的一件事是使用C strptime
来解耦日期,然后将其重建为NSDate
个对象。例如,下面的代码将收到的字符串称为“星期一,2009年9月28日星期四18:13:50”,并将其转换为适应本地时间的UTC时间的NSDate对象:
struct tm time;
strptime([currentStringValue UTF8String], "%A, %d-%b-%y %H:%M:%S %z", &time);
NSDate* myDate = [NSDate dateWithString:
[NSString stringWithFormat:@"%04d-%02d-%02d %02d:%02d:%02d +0000",
time.tm_year+1900, time.tm_mon+1, time.tm_mday,
time.tm_hour, time.tm_min, time.tm_sec]
];
(可以通过添加其他struct tm
参数而不是+0000固定时区来处理其他区域,有关详细信息,请参阅time.h entry on wikipedia:
答案 6 :(得分:0)
struct tm time;
if (strptime([modDateString UTF8String], "%A, %d %b %Y %H:%M:%S", &time)) {
NSString *rDate=[NSString stringWithFormat:@"%04d-%02d-%02d %02d:%02d:%02d +0000",
time.tm_year+1900, time.tm_mon+1, time.tm_mday,
time.tm_hour, time.tm_min, time.tm_sec];
此代码适用于HTTP日期,如2010年4月15日星期四格林尼治标准时间13:53:56和格林威治标准时间2009年5月8日星期五08:08:35这是原始问题