假设 Web 服务器设置在美国/夏威夷时区,当前本地时间是 2014 年 10 月 17 日晚上 11 点。然后
In [57]: datetime.datetime(2014, 10, 17, 23, 0, 0, tzinfo=pytz.timezone('US/Pacific')).date()
Out[57]: datetime.date(2014, 10, 17)
但是,美国/太平洋的当前时间是
In [44]: now = datetime.datetime(2014, 10, 17, 23, 0, 0)
In [45]: hawaii = pytz.timezone('US/Hawaii')
In [46]: pacific = pytz.timezone('US/Pacific')
In [47]: pacific.normalize(hawaii.localize(now).astimezone(pacific)).date()
Out[47]: datetime.date(2014, 10, 18)
这会导致您看到的症状。
简而言之,你几乎不想通过直接将它提供给 tzinfo 来构建一个时区感知的日期时间:
datetime.datetime.now(pytz.timezone('US/Pacific')).date()
如果您使用的是 pytz,请使用 pytz 时区的 localize 方法:
tzone.localize(naive_date)
顺便一提,
datetime.datetime.now(pytz.timezone('US/Pacific')).date()
总是等价于
datetime.datetime.now().date()
或者
datetime.date.today()
datetime.datetime.now(pytz.timezone('US/Pacific'))
datetime.datetime.now()
与将 tzinfo 设置为相同
pytz.timezone('US/Pacific')
,但如果您随后调用该date
方法,则 tzinfo 无关紧要,因为您返回的只是年、月和日期。