UTC偏移和时区的NSDate问题

时间:2013-09-07 17:28:40

标签: date timezone nsdate offset utc

我从ISO 8601格式的服务器中提取日期。日期表示特定节目的特定剧集播出的时间。这是一个示例日期:

“2013-07-30T21:00:00-05:00”

即2013年7月30日美国东部时间晚上9点。 EST为-05:00。当我尝试将日期显示给用户时(在这种情况下我自己),问题出现了。我目前处于中央时间,但夏令时很活跃。这意味着iOS表示我目前处于中部夏令时,也是-05:00(正常CST是-06:00)。

这个节目在我的CST时区晚上8点播出。无论夏令时是开启还是关闭都无关紧要,只要时钟到达晚上8点,节目就会播出。通常情况下,如果我没有夏令时,iOS将能够进行正确的转换,因为它将从-05:00转移到-06:00。我目前正处于夏令时,虽然它将-05:00视为原始偏移,-05:00视为当前偏移,因此它不进行转换并显示从晚上9:00开始的节目。知道怎么处理这个吗?

1 个答案:

答案 0 :(得分:0)

不幸的是,无法将{em>时区偏移(如-05:00)映射回实时时区,例如中央时间或东部时间。正如您所指出的,它可能是中部夏令时或东部标准时间。但是,它可能是任何数量的其他时区恰好在某一点或另一点使用-05:00偏移量。请参阅this list of time zones并按其中一个偏移列排序,以便了解它们的数量。您还可以look here

幸运的是,您还有另一条信息 - 日期/时间。因此,您可以使用它来部分区分这些区域的部分。如果您确定您的数据是美国,您也可以进一步限制歧义。

但仍有一个问题。像2013-11-03T01:00:00-05:00这样的时间实际上同时在 CDT和EST 怎么可能?那么,在美国,我们并非都在同一时刻改变我们的时钟。每个时区在当地时间凌晨2点更改它。所以每年有一个小时东部时间已经遇到了他们的后退过渡,但中央时间尚未到来。

处理所有这些问题的唯一真正方法是存储其他一些上下文信息,例如完整的IANA时区(东方America/New_York或中央America/Chicago等) - 或者如果它只是用于显示,那么你可以存储一个字符串,其中包含你选择的时区缩写(EST,CDT等)。

另请参阅:the timezone tag wiki中的“时区!=偏移”。