我的NSDateFormatter仅适用于iPhone模拟器

时间:2009-05-08 08:56:03

标签: iphone objective-c cocoa date

我使用的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上使用不同的区域设置,语言等。知道出了什么问题吗?

7 个答案:

答案 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

  • z~zz :(特定GMT时区缩写)
  • zzzz :(特定GMT时区名称)
  • Z:+0000(RFC 822 Timezone

感谢您的帮助!

答案 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)

strptime救了我。

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这是原始问题