Cocoa中的日期和时区问题

时间:2010-09-22 13:53:44

标签: iphone objective-c cocoa-touch nsdateformatter

我有一个字符串,例如2010-09-24。现在我想要读取这个字符串,就像我在其他时区一样。所以我创建了一个NSDateFormatter并设置了它的时区,例如到Europe/Berlin。我得到的是NSDate对象调整(2010-09-23 18:00:00)到我的本地时区(例如America/New_York)。

但我希望时区NSDate中的Europe/Berlin时间值为2010-09-24 00:00:00。我怎样才能做到这一点?

我尝试在Europe/Berlin期间将defaultTimeZone设置为[dateFormatter dateFromString:@"2010-09-24"]但是当我将timeZone更改回我的本地时区时,NSDate对象也会更改。

2 个答案:

答案 0 :(得分:6)

我认为你的问题的答案是自我叠加 Handling time zones in Cocoa

答案 1 :(得分:1)

NSDate只是一个CFDate,它代表一个CFAbsoluteTime,它只是POSIX时间(UTC-seconds-since-epoch),具有不同的纪元(2001而不是1970)。 (我很确定CFAbsoluteTimeGetCurrent()只调用gettimeofday();它似乎只有微秒分辨率。)

或者,简而言之:NSDate是时间戳,而不是日历日期。如果要表示日历日期/时间,请使用NSDateComponents。无论哪种情况,您都需要指定日历(可能是格里高利)和时区;见NSCalendar。

差异大致取决于更改时区偏移时发生的情况:

  • “我家的金星运输过程”随处可见,所以使用世界时(NSDate)
  • “午餐”发生在当地时间的中午,所以请使用NSDateComponents。

如果您假设事件的时区偏移量没有改变,则可以方便地指定NSDate和NSTimeZone名称。许多日历应用程序会这样做,并且(几乎)当美国决定更改DST规则时,一切都会出错。