datetime.nowtz和datetime年,月,日,tzinfo = tz没有相同的UTC偏移量

问题描述

为什么下面的代码在2个日期时间中创建的UTC偏移量不同?我正在使用pytz == 2019.1

from datetime import datetime
import pytz

EASTERN = pytz.timezone('US/Eastern')
dt1 = datetime.Now(EASTERN)
dt2 = datetime(2020,8,11,15,30,tzinfo=EASTERN)
print(f'dt1: {dt1}')
print(f'dt2: {dt2}')

结果:

dt1:2020-08-11 18:35:47.984745-04:00

dt2:2020-08-11 15:30:00-04:56

一个显示的UTC偏移为-04:00(对于一年中的这个时间)是正确的,但是第二个显示的UTC偏移为-04:56。

如何使用第二种方法声明日期时间并从第一种方法获取UTC偏移量。

解决方法

显示的代码的问题在于datetime.now(tz)可以将pytz.timezone作为tz的参数来处理,而默认构造函数datetime(y,m,d,...)则不能。在这种情况下,您必须使用localize的{​​{1}}方法,

timezone

dateutil避免了这个问题,可以找到更多信息here。这将使代码“按原样”工作:

from datetime import datetime
import pytz

EASTERN = pytz.timezone('US/Eastern')
dt1 = datetime.now(EASTERN)
dt2 = EASTERN.localize(datetime(2020,8,11,15,30))
print(f'dt1: {dt1}')
print(f'dt2: {dt2}')
# prints
# dt1: 2020-08-12 10:07:09.738763-04:00
# dt2: 2020-08-11 15:30:00-04:00

此外,from dateutil.tz import gettz EASTERN = gettz('US/Eastern') dt1 = datetime.now(EASTERN) dt2 = datetime(2020,30,tzinfo=EASTERN) print(f'dt1: {dt1}') print(f'dt2: {dt2}') # prints e.g. # dt1: 2020-08-12 10:20:07.796811-04:00 # dt2: 2020-08-11 15:30:00-04:00 可能是deprecated with Python 3.9,因为您将zoneinfo作为这类作业的标准库的一部分。

,

关于dt1

datetime.now()将从utc返回tzinfo。如果执行以下操作,您会看到此信息:

>>> repr(EASTERN.fromutc(datetime.now()))
"datetime.datetime(2020,12,33,28,849873,tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day,20:00:00 DST>)"

tz.fromutc()datetime.now()在幕后所做的事情。

关于dt2

如果您查看EASTERN的代表,则会看到以下内容:

>>> repr(EASTERN)
"<DstTzInfo 'US/Eastern' LMT-1 day,19:04:00 STD>"
>>> repr(dt2)
"datetime.datetime(2020,tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day,19:04:00 STD>)"

我对时区差异不太满意,所以我不想把您引向错误的方向,但是从我的判断来看,这两个选项都会产生相同的结果:

dt2 = datetime(2020,tzinfo=EASTERN)
dt2_eastern_corrected = EASTERN.fromutc(dt2)
dt3 = datetime(2020,30)
dt3_eastern_corrected = EASTERN.fromutc(dt3

>>> repr(dt2_eastern_corrected)
"datetime.datetime(2020,20:00:00 DST>)"
>>> repr(dt3_eastern_corrected)
"datetime.datetime(2020,20:00:00 DST>)"