【问题标题】:NSDateFormatter parses wrong?NSDateFormatter 解析错误?
【发布时间】:2013-05-15 13:59:38
【问题描述】:

以下代码

    NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setDateFormat:@"MM/dd/yyyy"];
    NSString* source = @"11/30/2012";
    NSDate* date = [dateFormatter dateFromString:source];
    NSLog(@"%@ → %@", source, date);

这个输出的结果

11/30/2012 → 2012-11-29 15:00:00 +0000

我预计时间会相同。 (即正确的 2012-11-30 00:00:00 +0000)...因为我知道输入时间已经是 UTC。因此,如果输出时间也以 UTC 输出,那么输出应该是同一时间。 这是时区问题吗?左侧字符串日期不应指定时区,NSDate 应输出 UTC 日期?

【问题讨论】:

  • 是的,这是时区问题。
  • 该帖子没有正确且简洁的答案被检查为正确。检查的答案太长了,没有重点。
  • 再澄清一点:如果您知道输入时间是UTC,那么您需要将NSDateFormatter的时区设置为UTC,否则它会默认为另一个时区(这里不确定,可能是当前的时区设备)。如果您希望在输入时间时使用另一个时区,则应将 NSDateFormatter 设置为该时区。 (所以这当然与 NSDate 无关)

标签: ios nsdateformatter


【解决方案1】:

直接打印 NSDate 总是会以标准格式打印日期和时间,时区为 GMT (+0000),而创建时会考虑系统的时区。

您似乎比 GMT/UTC 晚了 9 小时。

【讨论】:

  • 这与 NSDate 无关,这是使用 NSDateFormatter 解析的问题,需要设置为 UTC 时区。版主删除了我修复它的答案:[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
  • 你的评论很有趣。我的回答解释说,直接打印日期和使用日期格式化程序时的时区不匹配。隐式解决方案是设置格式化程序时区。我不能建议使用 UTC,因为在我写这个答案的时候,你告诉我们日期是 UTC。所以你的反对票是不合理的。我不知道,为什么你的答案被删除了,但我对此不承担任何责任。
【解决方案2】:

我想我明白了。

我加了

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];

现在得到

11-30-2012 → 2012-11-30 00:00:00 +0000

...因为我知道输入时间已经是 UTC。如果 NSDate 报告另一个 UTC 时间,则说明解析器 (NSDateFormatter) 解析不正确。

【讨论】:

    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多