Nil NSDate试图在祖鲁时间从UTC字符串获取日期

Eri*_*ese 22 iphone utc objective-c nsdate nsdateformatter

在Objective-C中编写一个iPhone应用程序,我有一个字符串形式的日期(UTC格式,最后用Z表示零UTC偏移,或祖鲁时间),我需要将其解析为一个NSDate对象.

一点代码:

NSDateFormatter* df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"];
NSString* str = @"2009-08-11T06:00:00.000Z";
NSDate* date = [df dateFromString:str];
通过调试器运行,date最终nil!我假设它与我的日期格式字符串有关.

如何修复它以正确解析日期字符串?

一个想法是Z在日期格式文字中,将日期格式设置为yyyy-MM-dd'T'HH:mm:ss.SSS'Z'.

这将起作用,除非将Z解析为文字,日期丢失了偏移信息,因此是不明确的,因此被解释为本地时间.

例如,如果要解析的字符串是2009-08-11T06:00:00.000Z(6:00祖鲁时间),它将被解释为当地时间的6:00,然后将应用不正确的偏移量.然后将其解析为2009-08-11T06:00:00.000-600(12:00祖鲁时间),偏移量取决于用户的偏移量.

谢谢!

NWC*_*der 28

我也有这个问题,我不确定它是否是Apple代码中的API错误,或者我缺乏理解,但我通过在我的日期字符串中使用小时偏移来解决它.

如果您将示例中的代码更改为:

NSDateFormatter* df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"];
NSString* str = @"2009-08-11T06:00:00.000-0700";   // NOTE -0700 is the only change
NSDate* date = [df dateFromString:str];
Run Code Online (Sandbox Code Playgroud)

它现在将解析日期字符串.当然-0700小时是我的抵消,你必须把它改成你的.希望这可以帮助.

  • 好的,我修好了.这是相关的一行:`[df dateFromString:[str stringByReplacingOccurrencesOfString:@"Z"withString:@" - 0000"]]` (3认同)

Ped*_*eno 13

大多数答案建议你将'Z'视为文字字符.不要这样做!

Z实际上意味着日期偏移0到UTC(+0000).

这是根据时区格式ISO8601:

ISO 8601时区格式:与UTC的常量,特定偏移量,除UTC本身("Z")外,其格式始终相同.

"-08:00"

"Z"

您要做的是为NSDateFormatter使用以下格式:

 NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
                                  // 2013-11-18T23:00:00.324Z
                                  [formatter setTimeZone:[NSTimeZone localTimeZone]];
                                  [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"];
                                  return formatter;
Run Code Online (Sandbox Code Playgroud)

通过重复Z五次,您可以告诉格式化程序在解析字符串时使用ISO8601.

奖金:

  • 使用一到三个Z s用于RFC 822 GMT格式.
  • 使用四个Z s进行本地化GMT格式.

有关更多信息,请查看文档.