将 pytz tzinfo 对象传递给fromtimestamp()
方法:
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
tz = pytz.timezone("Asia/Singapore")
print(datetime.fromtimestamp(1325376000, tz))
# -> 2012-01-01 08:00:00+08:00
注意:结果对象是时区感知的:您可以将其与其他感知日期时间对象进行比较,即,您无需将其转换为 UTC 进行比较——您可以按原样使用它。
当新加坡是 +08:00 时,我什至不知道 +06:55 来自哪里。
你看到+06:55
由于无效的.replace()
调用。get_current_timezone()
返回pytz.timezone("Asia/Singapore")
具有可变 utc 偏移量的返回值(它可能在不同日期具有不同的 utc 偏移量)。当您调用.replace()
一些随机(取决于实现)时使用 tzinfo 对象。问题是该.replace()
方法不允许pytz.timezone("Asia/Singapore")
为输入日期选择正确的 tzinfo。
>>> list(tz._tzinfos.values())
[<DstTzInfo 'Asia/Singapore' MALT+7:00:00 STD>,
<DstTzInfo 'Asia/Singapore' MALT+7:20:00 STD>,
<DstTzInfo 'Asia/Singapore' JST+9:00:00 STD>,
<DstTzInfo 'Asia/Singapore' SMT+6:55:00 STD>,
<DstTzInfo 'Asia/Singapore' SGT+7:30:00 STD>,
<DstTzInfo 'Asia/Singapore' MALT+7:30:00 STD>,
<DstTzInfo 'Asia/Singapore' MALST+7:20:00 DST>,
<DstTzInfo 'Asia/Singapore' LMT+6:55:00 STD>,
<DstTzInfo 'Asia/Singapore' SGT+8:00:00 STD>]
即,两者+06:55
都+0800
对新加坡有效(在不同的日期)。这就是为什么您应该.replace()
只使用具有恒定 utc 偏移量的时区,例如 utc 时区本身(偏移量为零,始终适用于任何日期)。
fromtimestamp(,tz)
内部方法调用tz.fromutc()
允许tz
为给定的 UTC 时间选择正确的偏移量。