【问题标题】:NSDateFormatter in iPad issueiPad问题中的NSDateFormatter
【发布时间】:2013-06-09 12:15:19
【问题描述】:

我有这个NSString

2010-05-29T16:31:49.000Z

我想用这个方法把它转换成 NSDate:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSDate *date = nil;
[dateFormatter setDateFormat:@"yyyy-MM-ddTHH:mm:ss.SSSZZZ"];
date = [dateFormatter dateFromString:dateSting];

当我运行它时,日期等于 Nil,知道为什么会发生吗?

它只发生在 iPad 上,而在 iPhone 上它可以完美运行.....

【问题讨论】:

  • 只是在黑暗中刺伤:您的 iPad 的时间/日期设置是否与 iPhone 有任何方面的差异
  • 请检查,我已经编辑了符合 ISO8601 解析日期方式的答案。

标签: iphone ios objective-c ipad


【解决方案1】:

来自http://www.w3.org/TR/NOTE-datetime 的注释。感谢 borrrden 引起注意。

时间以 UTC(协调世界时)表示,带有 特殊的 UTC 指示符(“Z”)。

NSString *inputString = @"2010-05-29T16:31:49.000Z";

NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"en_US_POSIX"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSz"];

NSDate *date = [dateFormatter dateFromString:inputString];

【讨论】:

  • T 是,但 Z 实际上表示“UTC”(而不是写 -01:00 等)。所以要小心这个。这个字符串是 ISO8601,应该这样解析。见w3.org/TR/NOTE-datetime
  • @borrrden 感谢您注意到这一点。我已经引用了NSDateFormatter 中指定的 dateFormats,找不到对应的,所以使用了后备。请看够不够
  • 小写字母 z 就足够了,我最近发现。在 iOS 6+ 中有一个新的 ISO8601 (ZZZZZ) 说明符,但这对 iOS 5 没有帮助。 NSDateFormatters 似乎理解日期字符串中的 Z 指示符。此外,如果所有 OP 得到的是“Z”,那么他是解析它还是真的忽略它都没关系。但是,我担心未来的人会阅读这篇文章。
  • @Anupdas,您好,但是在“2013-06-04T16:55:00Z”这个字符串的情况下,这个解决方案不起作用。你能帮我么。谢谢+1
  • @Mangesh 你能验证它是yyyy-MM-dd'T'HH:mm:ssz还是yyyy-dd-MM'T'HH:mm:ssz
【解决方案2】:

这个问题已经被问过很多次了。您的格式化程序对您的输入字符串无效:

yyyy-MM-dd'T'HH:mm:ss.SSSX

不确定您使用的是哪一种时区模式,所以最后应该使用XXXXXXX

http://www.unicode.org/reports/tr35/tr35-dates.html。请注意,Z 不允许用于时区模式 ZZZ

【讨论】:

  • 请注意,格式化程序的行为在 iOS 5 和 iOS 6 之间发生了变化。您应该始终使用正确的格式模式,因为您无法确定稍微不正确的模式是否会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
相关资源
最近更新 更多