NSDateFormatter在OS 4.0中返回nil

时间:2010-06-22 15:55:16

标签: iphone ios4 nsdateformatter

我在OS 3.x上有以下代码

NSString *stringDate = @"2010-06-21T20:06:36+00:00";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
NSDate *theDate = [dateFormatter dateFromString:stringDate];
NSLog(@"%@",[dateFormatter stringFromDate:theDate]);

但现在在iOS4模拟器下的最新xcode 3.2.3中,变量theDate为零。

我查看了类引用,并没有看到任何已弃用或使用这些特定方法对iOS4实现不同的内容。我遗漏了什么?

13 个答案:

答案 0 :(得分:41)

如果你这样做,我发现它有效(见下文)。关键是使用方法: - [NSDateFormatter getObjectValue:forString:range:error:]

而不是

-[NSDateFormatter dateFromString]

完整的代码:

+ (NSDate *)parseRFC3339Date:(NSString *)dateString 
{
    NSDateFormatter *rfc3339TimestampFormatterWithTimeZone = [[NSDateFormatter alloc] init];
    [rfc3339TimestampFormatterWithTimeZone setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
    [rfc3339TimestampFormatterWithTimeZone setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];

    NSDate *theDate = nil;
    NSError *error = nil; 
    if (![rfc3339TimestampFormatterWithTimeZone getObjectValue:&theDate forString:dateString range:nil error:&error]) {
        NSLog(@"Date '%@' could not be parsed: %@", dateString, error);
    }

    [rfc3339TimestampFormatterWithTimeZone release];
    return theDate;
}

答案 1 :(得分:8)

您的设备是否设置为24小时或12小时?

这听起来像是一个疯狂的问题,但我遇到了这个错误 - dateformatter会根据当前的语言环境调整你的格式字符串,其中包括时间格式设置。

您可以通过添加以下行来强制它忽略它们:

dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];

希望有所帮助。

答案 2 :(得分:5)

此代码将删除AtomRiot描述的额外冒号:

  

转换自:

     
      
  • NSString *stringDate = @"2010-06-21T20:06:36+00:00";
  •   
     

     
      
  • NSString *stringDate = @"2010-06-21T20:06:36+0000";
  •   
// Remove colon in timezone as iOS 4+ NSDateFormatter breaks
if (stringDate.length > 20) {
    stringDate = [stringDate stringByReplacingOccurrencesOfString:@":"
                                                       withString:@""
                                                          options:0
                                                            range:NSMakeRange(20, stringDate.length-20)];
}

有关详细信息,请参阅:https://devforums.apple.com/thread/45837

答案 3 :(得分:2)

我最近遇到过这个问题。我最终使用了Peter Hosey的ISO8601解析器。它可以在这里找到:http://boredzo.org/iso8601unparser/

答案 4 :(得分:2)

Apple文档看起来好像是“棘手”:

  

格式字符串使用格式   来自Unicode标准的模式   (此参考版本为 tr35-6   对于Mac OS X v10.5; 适用于Mac OS X v10.4   使用版本tr35-4 )。

  

iOS :v10.0兼容模式为   不适用于iOS版本 10.4   模式可用。

根据版本 tr35-4

  

使用1表示GMT格式,2表示RFC 822

     

Z {1} GMT-08:00
  Z {2} -0800

但根据 Unicode 标准:

  

使用一至三个字母表示RFC 822,四个字母表示GMT格式。

     

Z {1,3} -0800
  Z {4} GMT-08:00

所以看起来iOS 4正在使用 tr35-6 - Unicode标准,这就是 +00:00 现在对“Z”失败的原因。

我在NSDateFormatter中对'ZZZZ'尝试 -08:00 ,在iOS 4中失败 GMT-08:00 ,然而,确实有效。现在看来时区(GMT)是必需的,而不是像iOS 3中那样可选的。

答案 5 :(得分:1)

我从dataFormat @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'+'hh:mm";

获取值

答案 6 :(得分:1)

我获得的格式是RFC 822和GMT之间的格式。如果我将“+00:00”更改为“+0000”,那么我可以在格式上使用“Z”。如果我将其更改为“GMT + 00:00”,那么我可以使用ZZZZ来正确获取数据。似乎有些东西已被剥离以处理这种混合,因为它在使用OS 3.x之前一直在为我工作。

答案 7 :(得分:0)

对我来说很好。

它是否仍能在真实设备上正常运行?

如果是,请提交模拟器的错误报告,否则请提交iOS 4的错误报告。

答案 8 :(得分:0)

我只是在调试这个完全相同的问题。我在3.x而不是4.0中使用相同的日期字符串。相同的症状。

查看NSDateFormatter文档时,我看到:

初始化日期格式化程序 - init通过iPhone OS 3.2在iPhone OS 2.0中可用

这表示不推荐使用iOS 4.0的init方法。我不确定这意味着什么。

答案 9 :(得分:0)

Elfred发布的链接完成了这个伎俩。在将我的应用程序从3.1.3转换为iOS4时,我偶然发现了同样的问题。该链接包含ISO8601DateFormatter类,这是一个比我自己的日期实用程序类更优秀的扩展。

  

Elfred写道:我最近遇到了这个问题。我最终使用了Peter Hosey的ISO8601解析器。它可以在这里找到:http://boredzo.org/iso8601unparser/

答案 10 :(得分: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;
}

答案 11 :(得分:0)

我的应用中也遇到了同样的问题Null Value from NSDateFormatter

我发现我的问题如下:

我向我的应用发送了这样的日期和时间:07/16/2010 04:21:00 +00:00,格式化程序如下:[dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm:ss ZZZ"]

看起来形成NO LONGER的ZZZ部分接受冒号:当时。

作品:07/16/2010 04:21:00 +0000

不起作用:07/16/2010 04:21:00 +00:00

为了支持当前的应用,我所做的只是搜索字符串中的+00:00部分,并将其替换为+0000

希望这可能有助于其他人。

答案 12 :(得分:0)

我使用它就像:

date_formatter = [[NSDateFormatter alloc] init];
        [date_formatter setDateStyle:NSDateFormatterShortStyle];
        [date_formatter setTimeStyle:NSDateFormatterNoStyle];

这很有效。我不明白当NSDateFormatter类是从NSObject生成子类时,他们如何弃用init方法