python datetime.datetime在夏令时下不返回正确的时区信息
我在用Python创建日期的时候遇到了一些问题,因为我创建的日期在某些情况下没有考虑到夏令时。
举个例子,如果我在命令行里运行:
>>> adjust_datetime_to_timezone(value=datetime.datetime.now(), from_tz=timezone('UTC'), to_tz=timezone('US/Pacific'))
datetime.datetime(2011, 7, 7, 12, 41, 16, 337918, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)
我能得到正确的时间。
我想创建一个代表今天开始的日期,所以我运行:
>>> datetime.datetime(year=2011, month=7, day=7, tzinfo=timezone('US/Pacific'))
datetime.datetime(2011, 7, 7, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>)
注意,这个日期是太平洋标准时间(PST),因为当我把它转换成协调世界时间(UTC)的时候:
>>> adjust_datetime_to_timezone(datetime.datetime(year=2011, month=7, day=7, tzinfo=timezone('US/Pacific')), from_tz=timezone('US/Pacific'), to_tz=timezone('UTC')) datetime.datetime(2011, 7, 7, 8, 0, tzinfo=<UTC>)
注意,这个时间是2011年07月07日早上08:00 UTC,实际上是早上01:00太平洋夏令时(PDT)。
有没有人知道为什么在使用datetime.datetime构造函数时,Python给我的是PST日期,而在调整时区时却不是呢?
1 个回答
3
从你看到的 <DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>
来看,似乎你在使用 pytz
这个库。在这种情况下,你可以使用 localize 方法来创建考虑时区的日期时间,这样就能自动调整夏令时了。(最好不要使用 datetime.datetime
的 tzinfo
参数,因为它不会自动调整夏令时。)
import pytz
import datetime as dt
now=dt.datetime(year=2011, month=7, day=7)
utc=pytz.utc
pacific=pytz.timezone('US/Pacific')
now_pacific=pacific.localize(now)
now_utc=now_pacific.astimezone(utc)
print(repr(now_pacific))
# datetime.datetime(2011, 7, 7, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)
print(repr(now_utc))
# datetime.datetime(2011, 7, 7, 7, 0, tzinfo=<UTC>)