Python (datetime) 时区转换关闭 4 分钟

Python (datetime) timezone conversion off by 4 minutes

当我 运行 此代码时:

#!/usr/bin/env python3
from datetime import datetime, timedelta
from dateutil import tz
from pytz import timezone

time = "2020-01-15 10:14:00"
time = datetime.strptime(time, "%Y-%m-%d %H:%M:%S")

print("time1 = " + str(time))

time = time.replace(tzinfo=timezone('America/New_York'))
print("time2 = " + str(time))

time = time.astimezone(tz.gettz('UTC')) # explicity convert to UTC time
print("time3 = " + str(time))

time = datetime.strftime(time, "%Y-%m-%d %H:%M:%S")  # output format
print("done time4 = " + str(time))

我得到这个输出:

time1 = 2020-01-15 10:14:00
time2 = 2020-01-15 10:14:00-04:56
time3 = 2020-01-15 15:10:00+00:00
done time4 = 2020-01-15 15:10:00

我原以为最后时间是“2020-01-15 15:14:00”有人知道为什么它会延迟 4 分钟吗?我不明白为什么 time2 中的偏移量是“-04:56”而不是“-05:00”

From pytz documentation:

This library differs from the documented Python API for tzinfo implementations; if you want to create local wallclock times you need to use the localize() method documented in this document. In addition, if you perform date arithmetic on local times that cross DST boundaries, the result may be in an incorrect timezone (ie. subtract 1 minute from 2002-10-27 1:00 EST and you get 2002-10-27 0:59 EST instead of the correct 2002-10-27 1:59 EDT).

所以,您使用的 pytz 不正确。

以下代码既正确又错误以下代码显示了您使用 pytz (datetime.replace(tzinfo=pytz.timezone)) 的结果,以及将 pytz 与 datetime ( pytz.timezone.localize(datetime)).

from datetime import datetime, date, time, timezone
from dateutil import tz
import pytz


d = date(2019, 1, 27)
t = time(19, 32, 00)

t1 = datetime.combine(d, t)
t1_epoch = t1.timestamp()
print("t1_epoch " + str(t1_epoch))
print("t1 " + str(t1))


# your approach/code
nytz = pytz.timezone('America/New_York')
t3 = t1.replace(tzinfo=nytz)
t3_epoch = t3.timestamp()
print("t3_epoch " + str(t3_epoch))
print("t3 " + str(t3))

# recommended approach/code using localize
nytz = pytz.timezone('America/New_York')
t6 = nytz.localize(t1)
t6_epoch = t6.timestamp()
print("t6_epoch " + str(t6_epoch))
print("t6 " + str(t6))

以上代码的输出:

t1_epoch 1548617520.0
t1 2019-01-27 19:32:00
t3_epoch 1548635280.0
t3 2019-01-27 19:32:00-04:56
t6_epoch 1548635520.0
t6 2019-01-27 19:32:00-05:00

t3 是你在做什么,它给出了不正确的偏移量(-4:56)。请注意,在这种情况下 POSIX 时间也不正确。 POSIX 时间,根据定义,不随时区变化。

t6 已使用 pytz.timezone.localize() 方法创建,并提供正确的 UTC 偏移量 (-5:00)。

更新:将答案的语言更新为

我知道这是一个旧线程,但我今天在将日期从 America/Sao_Paulo 时区向前和向后转换为 UTC 时遇到了这个确切的问题。但就我而言,它关闭了 6 分钟。

合并@narendra-choudhary 提供的解决方案我得到了这个:

import pytz
from datetime import datetime
# Simulating unaware date created by user in front-end
in_date = datetime.now()
z = pytz.timezone("America/Sao_Paulo")
aware_localized_date = z.localize(in_date)
# Now converting to UTC
utc_date = aware_localized_date.astimezone(pytz.UTC)
print(utc_date.strftime("%d/%m/%Y %H:%M:%S"))
print(in_date.strftime("%d/%m/%Y %H:%M:%S"))

输出为:

>>> print(utc_date.strftime("%d/%m/%Y %H:%M:%S"))
11/06/2021 21:56:02
>>> print(in_date.strftime("%d/%m/%Y %H:%M:%S"))
11/06/2021 18:56:02
>>>

感谢@narendra-choudhary,我的代码现在可以正常工作了!希望对迷茫的小伙伴有所帮助