datetime.now(tz) 和 datetime(year, month, day, tzinfo=tz) 没有相同的 UTC 偏移量
datetime.now(tz) and datetime(year, month, day, tzinfo=tz) don't have same UTC offset
为什么在下面的代码中创建的 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 偏移量。
关于 dt1
:
datetime.now()
将 return 来自 utc 的 tzinfo
。如果您执行以下操作,您可以看到它:
>>> repr(EASTERN.fromutc(datetime.now()))
"datetime.datetime(2020, 8, 11, 12, 33, 28, 849873, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)"
tz.fromutc()
是 datetime.now()
在幕后所做的事情。
关于 dt2
:
如果您查看 EASTERN 的 repr,您将看到以下内容:
>>> repr(EASTERN)
"<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>"
>>> repr(dt2)
"datetime.datetime(2020, 8, 11, 15, 30, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>)"
我对时区差异不太满意,所以我不想误导您,但据我所知,这两个选项都会产生相同的结果:
dt2 = datetime(2020, 8, 11, 15, 30, tzinfo=EASTERN)
dt2_eastern_corrected = EASTERN.fromutc(dt2)
dt3 = datetime(2020, 8, 11, 15, 30)
dt3_eastern_corrected = EASTERN.fromutc(dt3
>>> repr(dt2_eastern_corrected)
"datetime.datetime(2020, 8, 11, 11, 30, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)"
>>> repr(dt3_eastern_corrected)
"datetime.datetime(2020, 8, 11, 11, 30, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)"
所示代码的问题是 datetime.now(tz)
可以将 pytz.timezone
作为 tz
参数处理,而默认构造函数 datetime(y,m,d,...)
不能。在这种情况下,您必须使用 timezone
、
的 localize
方法
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
dateutil avoids this issue, more info can be found here。这将使代码“按原样”工作:
from dateutil.tz import gettz
EASTERN = gettz('US/Eastern')
dt1 = datetime.now(EASTERN)
dt2 = datetime(2020, 8, 11, 15, 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
此外,pytz
很可能 deprecated with Python 3.9 as you'll have zoneinfo 作为此类工作的标准库的一部分。
为什么在下面的代码中创建的 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 偏移量。
关于 dt1
:
datetime.now()
将 return 来自 utc 的 tzinfo
。如果您执行以下操作,您可以看到它:
>>> repr(EASTERN.fromutc(datetime.now()))
"datetime.datetime(2020, 8, 11, 12, 33, 28, 849873, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)"
tz.fromutc()
是 datetime.now()
在幕后所做的事情。
关于 dt2
:
如果您查看 EASTERN 的 repr,您将看到以下内容:
>>> repr(EASTERN)
"<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>"
>>> repr(dt2)
"datetime.datetime(2020, 8, 11, 15, 30, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>)"
我对时区差异不太满意,所以我不想误导您,但据我所知,这两个选项都会产生相同的结果:
dt2 = datetime(2020, 8, 11, 15, 30, tzinfo=EASTERN)
dt2_eastern_corrected = EASTERN.fromutc(dt2)
dt3 = datetime(2020, 8, 11, 15, 30)
dt3_eastern_corrected = EASTERN.fromutc(dt3
>>> repr(dt2_eastern_corrected)
"datetime.datetime(2020, 8, 11, 11, 30, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)"
>>> repr(dt3_eastern_corrected)
"datetime.datetime(2020, 8, 11, 11, 30, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)"
所示代码的问题是 datetime.now(tz)
可以将 pytz.timezone
作为 tz
参数处理,而默认构造函数 datetime(y,m,d,...)
不能。在这种情况下,您必须使用 timezone
、
localize
方法
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
dateutil avoids this issue, more info can be found here。这将使代码“按原样”工作:
from dateutil.tz import gettz
EASTERN = gettz('US/Eastern')
dt1 = datetime.now(EASTERN)
dt2 = datetime(2020, 8, 11, 15, 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
此外,pytz
很可能 deprecated with Python 3.9 as you'll have zoneinfo 作为此类工作的标准库的一部分。