我有一个字符串,例如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
对象也会更改。
答案 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和NSTimeZone名称。许多日历应用程序会这样做,并且(几乎)当美国决定更改DST规则时,一切都会出错。