编辑:我想在我的国家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")
but格式化它,但没有成功。
问题2:在Raspberrypi中运行此代码(完成后我将运行代码),Python3,我在此行madrid = dt.astimezone(madrid_tz)
中得到一个ValueError。错误是ValueError: astimezone() cannot be applied to a naive datetime
有任何想法吗?
让我们更清楚一下这里的内容:
madrid = pytz.timezone('Europe/Madrid')
时区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)
同一时间戳,现在附有欧洲/马德里时区,即马德里时间14:45(UTC + 1)。
utc_ts = madrid_ts.astimezone(pytz.utc)
同时在UTC时间14:45在UTC(UTC + 1),所以,14:45-1小时→13:45。一切如预期。如果在马德里时间是14:45,那么UTC的时间是13:45,因为马德里比UTC早一个小时。
datetime.now()
无论是什么......它与上面的两个时间戳中的任何一个都无关,并且取决于机器的默认时区以及执行此代码时的当前时间。
我认为你误解了localize
和astimezone
,因为你用localize
在欧洲/马德里时区创建你的2019-03-01 14:45日期时间对象,然后用astimezone
将它转换为UTC,这会给你意想不到的结果。
相反,您似乎意味着要为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
示例(请注意,datetime对象是在与每个时区对应的时间内创建的,因此两者都代表相同的时间点):
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