我无法理解“etc / GMT-5”时区与pytz中的UTC之间的转换。
>>> dt = datetime(2009, 9, 9, 10, 0) # September 9 2009, 10:00
>>> gmt_5 = pytz.timezone("Etc/GMT-5")
>>> gmt_5.localize(dt)
datetime.datetime(2009, 9, 9, 10, 0, tzinfo=<StaticTzInfo 'Etc/GMT-5'>)
到目前为止一切都很好,但后来我尝试将其转换为UTC:
>>> gmt_5.localize(dt).astimezone(pytz.utc)
datetime.datetime(2009, 9, 9, 5, 0, tzinfo=<UTC>)
所以对我而言,似乎从GMT-5的10:00转换到UTC我得到05:00?我希望pytz给我15:00代替。
我错过了什么?
编辑:我已经确认美国/东部时区的时区转换正如我所期望的那样:
>>> eastern = pytz.timezone("US/Eastern")
>>> eastern.localize(dt)
datetime.datetime(2009, 9, 9, 10, 0, tzinfo=...) # Too long
>>> pytz.utc.normalize(eastern.localize(dt).astimezone(pytz.utc))
datetime.datetime(2009, 9, 9, 14, 0, tzinfo=<UTC>)
编辑2:我已经确认,当我使用Etc / GMT + 5时,我得到15:00,这是我期望从Etc / GMT-5获得的。这是一个pytz错误吗?
答案 0 :(得分:12)
这显然是POSIX的事情。来自Wikipedia:
为了符合POSIX风格,那些以“Etc / GMT”开头的区域的标志与大多数人的期望相反。在这种风格中,格林威治标准时间以西的区域有一个正号,东方区域有一个负号。
答案 1 :(得分:0)
This bug report解释了这种行为。显然他们知道它全部倒转了,但那是因为其他任何东西都会破坏兼容性。