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

问题描述 投票:5回答:2

编辑:我想在我的国家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

有任何想法吗?

python utc pytz
2个回答
3
投票

让我们更清楚一下这里的内容:

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

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


1
投票

我认为你误解了localizeastimezone,因为你用localize在欧洲/马德里时区创建你的2019-03-01 14:45日期时间对象,然后用astimezone将它转换为UTC,这会给你意想不到的结果。

相反,您似乎意味着要为2019-03-01 14:45创建日期时间对象,然后您希望在欧洲/马德里时间和UTC时间显示该日期时间。您可以使用astimezonelocalize来获得所需的结果。

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
© www.soinside.com 2019 - 2024. All rights reserved.