为了账号安全,请及时绑定邮箱和手机立即绑定

模块 pytz:UTC 减少而不是增加

模块 pytz:UTC 减少而不是增加

墨色风雨 2021-11-23 16:42:51
我想将我所在国家/地区的 UTC 时间转换为 UTC(西班牙)。我正在使用模块 pytz 进行转换,但我得到的结果是 UTC-1 而不是 UTC+1。这是我的代码:import datetimeimport pytzmadrid = pytz.timezone("Europe/Madrid")UTC_time = datetime.datetime.strptime("2019-03-01 14:45","%Y-%m-%d %H:%M")madrid_dt = madrid.localize(UTC_time, is_dst=None)MadridTime = madrid_dt.astimezone(pytz.utc).strftime ("%Y-%m-%d %H:%M")这是输出:UTC_Time: 2019-03-01 14:45:00MadridTime: 2019-03-01 13:45我需要马德里时间返回 15:45 而不是 13:45。我究竟做错了什么?EDITED2:在您的帮助下,我发现我混淆了 localize 和 astimeszone 的使用。现在我面临两个新问题。这是新代码:import datetimeimport pytzdt = datetime.datetime.strptime('2019-03-01 14:45','%Y-%m-%d %H:%M')madrid_tz = pytz.timezone('Europe/Madrid')madrid = dt.astimezone(madrid_tz)print(madrid)# 2019-03-01 14:45:00+01:00print(madrid.strftime ("%Y-%m-%d %H:%M"))# 2019-03-01 14:45问题 1:在 Windows 10、Python3 中运行此代码,我预期的输出2019-03-01 15:45:00不是2019-03-01 14:45:00+01:00. 我试图格式化它,strftime ("%Y-%m-%d %H:%M")但这并没有成功。问题 2:在 Raspberrypi(这是我将在完成后运行代码的地方)中运行此代码,Python3,我在这一行中收到一个 ValueError madrid = dt.astimezone(madrid_tz)。错误是ValueError: astimezone() cannot be applied to a naive datetime有任何想法吗?
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

让我们更清楚地说明这里的内容:

madrid = pytz.timezone('Europe/Madrid')

欧洲/马德里时区,即 UTC+1/+2。

naive_ts = datetime.strptime('2019-03-01 14:45', '%Y-%m-%d %H:%M')

没有任何特定时区的朴素时间戳。

madrid_ts = madrid.localize(naive_ts)

相同的时间戳,现在附加时区 Europe/Madrid,即马德里的 14:45 (UTC+1)

utc_ts = madrid_ts.astimezone(pytz.utc)

UTC 中马德里的 14:45 (UTC+1) 相同,因此,14:45 - 1 小时 → 13:45。一切都在预料之中。如果在马德里是 14:45,那么在 UTC 是 13:45,因为马德里比 UTC 早一小时。

datetime.now()

不管是什么……它与上述两个时间戳中的任何一个都无关,并且取决于您机器的默认时区以及您执行此代码时的当前时间。


查看完整回答
反对 回复 2021-11-23
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

我想你是误会localize和astimezone,因为你是创建2019年3月1日14:45在与欧洲/马德里时区的datetime对象localize,然后将其转换为UTC与astimezone它给你意想不到的结果。


相反,您似乎打算为 2019-03-01 14:45 创建一个日期时间对象,然后您想以欧洲/马德里时间和 UTC 时间显示该日期时间。您可以使用astimezone或localize来获得所需的结果。


astimezone 例子:


import datetime

import pytz


dt = datetime.datetime.strptime('2019-03-01 14:45','%Y-%m-%d %H:%M')


madrid_tz = pytz.timezone('Europe/Madrid')

madrid = dt.astimezone(madrid_tz)

print(madrid)

# 2019-03-01 15:45:00+01:00


utc = dt.astimezone(pytz.utc)

print(utc)

# 2019-03-01 14:45:00+00:00

localize 示例(请注意,日期时间对象是在对应于每个时区的时间创建的,因此两者将代表相同的时间点):


import datetime

import pytz


madrid_tz = pytz.timezone('Europe/Madrid')

madrid = madrid_tz.localize(datetime.datetime(2019, 3, 1, 15, 45))

print(madrid)

# 2019-03-01 15:45:00+01:00


utc = pytz.utc.localize(datetime.datetime(2019, 3, 1, 14, 45))

print(utc)

# 2019-03-01 14:45:00+00:00


查看完整回答
反对 回复 2021-11-23
  • 2 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信