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

我想将我所在国家/地区的 UTC 时间转换为 UTC(西班牙)。我正在使用模块 pytz 进行转换,但我得到的结果是 UTC-1 而不是 UTC+1。这是我的代码:


import datetime

import pytz


madrid = 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:00

MadridTime: 2019-03-01 13:45

我需要马德里时间返回 15:45 而不是 13:45。我究竟做错了什么?


EDITED2:在您的帮助下,我发现我混淆了 localize 和 astimeszone 的使用。现在我面临两个新问题。这是新代码:


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 14:45:00+01:00


print(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


有任何想法吗?


墨色风雨
浏览 176回答 2
2回答

蝴蝶刀刀

让我们更清楚地说明这里的内容: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()不管是什么……它与上述两个时间戳中的任何一个都无关,并且取决于您机器的默认时区以及您执行此代码时的当前时间。

繁星淼淼

我想你是误会localize和astimezone,因为你是创建2019年3月1日14:45在与欧洲/马德里时区的datetime对象localize,然后将其转换为UTC与astimezone它给你意想不到的结果。相反,您似乎打算为 2019-03-01 14:45 创建一个日期时间对象,然后您想以欧洲/马德里时间和 UTC 时间显示该日期时间。您可以使用astimezone或localize来获得所需的结果。astimezone 例子: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 15:45:00+01:00utc = dt.astimezone(pytz.utc)print(utc)# 2019-03-01 14:45:00+00:00localize 示例(请注意,日期时间对象是在对应于每个时区的时间创建的,因此两者将代表相同的时间点):import datetimeimport pytzmadrid_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:00utc = pytz.utc.localize(datetime.datetime(2019, 3, 1, 14, 45))print(utc)# 2019-03-01 14:45:00+00:00
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python