带有UTC偏移量和时区的NSDate问题

带有UTC偏移量和时区的NSDate问题,date,timezone,nsdate,offset,utc,Date,Timezone,Nsdate,Offset,Utc,我正在从服务器上提取ISO 8601格式的日期。日期表示特定节目的特定插曲播放的时间。以下是一个示例日期: “2013-07-30T21:00:00-05:00” 也就是2013年7月30日美国东部时间晚上9点。美国东部时间-05:00。当我尝试将日期显示回用户(在本例中是我自己)时,问题就出现了。我目前在中央时间,但夏令时处于活动状态。这意味着iOS说我现在处于中心夏时制,也就是-05:00(正常CST是-06:00) 该节目于晚上8:00在我的CST时区播出。夏令时是开还是关都没关系,只要时

我正在从服务器上提取ISO 8601格式的日期。日期表示特定节目的特定插曲播放的时间。以下是一个示例日期:

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

也就是2013年7月30日美国东部时间晚上9点。美国东部时间-05:00。当我尝试将日期显示回用户(在本例中是我自己)时,问题就出现了。我目前在中央时间,但夏令时处于活动状态。这意味着iOS说我现在处于中心夏时制,也就是-05:00(正常CST是-06:00)


该节目于晚上8:00在我的CST时区播出。夏令时是开还是关都没关系,只要时间到了晚上8点,节目就会播出。通常,如果我不在夏令时,iOS将能够进行适当的转换,因为它将从-05:00移动到-06:00。由于我目前处于夏令时,虽然它将-05:00视为原始偏移量,将-05:00视为我的当前偏移量,因此它不进行转换,并从晚上9:00开始显示节目。你知道如何处理这个问题吗?

不幸的是,没有办法将像
-05:00
这样的时区偏移量映射回像中部时间或东部时间这样的实际时区。正如你所指出的,它可以是中央夏时制,也可以是东部标准时间。但是,可能是任意数量的其他时区碰巧在某个点使用了
-05:00
偏移量。查看其中一个偏移列并按其排序,以便了解它们的数量。你也可以

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

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

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

另请参见中的“时区!=偏移”