Python 带有pytz时区的日期时间。不同的偏移量取决于tzinfo的设置方式

Python 带有pytz时区的日期时间。不同的偏移量取决于tzinfo的设置方式,python,datetime,timezone,pytz,Python,Datetime,Timezone,Pytz,我今天遇到了一个有趣的情况。有人能解释为什么ts1和ts2的偏移量不同吗?ts1是一个datetime对象,可以立即识别时区。ts2是一个datetime对象,它从时区初始开始,并替换了它的tzinfo。但是,它们最终的偏移量不同 >>> from pytz import timezone >>> EST = timezone('America/New_York') >>> ts1 = datetime.datetime.now(tz=EST

我今天遇到了一个有趣的情况。有人能解释为什么ts1和ts2的偏移量不同吗?ts1是一个datetime对象,可以立即识别时区。ts2是一个datetime对象,它从时区初始开始,并替换了它的tzinfo。但是,它们最终的偏移量不同

>>> from pytz import timezone
>>> EST = timezone('America/New_York')
>>> ts1 = datetime.datetime.now(tz=EST)
>>> ts2 = datetime.datetime.now()
>>> ts2 = ts2.replace(tzinfo=EST)
>>> print ts1
2014-05-16 11:25:16.749748-04:00
>>> print ts2
2014-05-16 11:25:19.581710-05:00

调用
ts2.replace(tzinfo=EST)
时,您得到的
tzinfo
对象与您得到的
ts1
对象不匹配:

>>> ts1
datetime.datetime(2014, 5, 16, 11, 51, 7, 916090, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>)
>>> ts2
datetime.datetime(2014, 5, 16, 11, 51, 30, 922692, tzinfo=<DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>)
这意味着您正在从UTC转换,使用
pytz
是安全的。这就是为什么第一种方法有效。

根据,将时区应用于原始日期时间的正确方法是使用
本地化
方法

ts1 = eastern.localize(datetime.datetime.now())

另外,我建议您使用avoid
EST
作为变量名,因为它通常是“东部标准时间”的标准,而
America/New_York
包含“东部标准时间”(EST)和“东部夏令时”(EDT)。

在DST转换期间,它可能会返回不正确的结果,请使用
datetime.now(东部)
相反。
pytz
提供了
.fromutc()
方法的自定义实现,该方法使用
\utc\u transition\u times
列表来获取正确的tzinfo对象。
ts1 = eastern.localize(datetime.datetime.now())