我正在尝试将UTC时间戳转换为西班牙时区中的时间戳。
>>> import datetime as dt
>>> import pytz
>>> today = dt.datetime.utcfromtimestamp(1573516800)
datetime.datetime(2019, 11, 12, 0, 0)
>>> today.replace(tzinfo=pytz.timezone('Europe/Madrid')).timestamp()
1573517700.0
>>> today.replace(tzinfo=pytz.timezone('Etc/GMT+1')).timestamp()
1573520400.0
我为Europe/Madrid
和Etc/GMT+1
获得不同的结果感到惊讶。为什么是这样? Europe/Madrid
应该以不同的方式使用,还是可能是一个错误?
答案 0 :(得分:2)
UTC时间戳:自1970年1月1日UTC以来的秒数。
Python日期时间:用户友好的查看时间的好方法
UTC时间戳不受时区影响,但datetime受到影响。
此代码采用给定的时间戳,并将其转换为UTC日期时间和欧洲/马德里时区。
import datetime as dt
import pytz
# define the old and new timezones
old_timezone = pytz.timezone("UTC")
new_timezone = pytz.timezone("Europe/Madrid")
# get an 'offset-aware' datetime
today = dt.datetime.utcfromtimestamp(1573516800)
my_datetime = old_timezone.localize(today)
# returns datetime in the new timezone
my_datetime_in_new_timezone = my_datetime.astimezone(new_timezone)
print("Old:", str(my_datetime), "\nNew:", str(my_datetime_in_new_timezone), "\nDifference:",
str(my_datetime - my_datetime_in_new_timezone))
输出:
Old: 2019-11-12 00:00:00+00:00
New: 2019-11-12 01:00:00+01:00
Difference: 0:00:00
代码改编自: Python: How do you convert datetime/timestamp from one timezone to another timezone?
答案 1 :(得分:1)
几件事:
Europe/Madrid
在标准时间是UTC + 1,在夏季时间(又名夏时制)是UTC + 2。
Etc/GMT+1
是整年的UTC-1。请注意,该符号与您预期的相反。请参阅tzdata源和on Wikipedia中的说明。
由于马德里在您提供的日期是UTC + 1,因此如果您使用Etc/GMT-1
,则在该日期将获得相同的结果。但是,我不建议这样做,因为这样以后您在夏季的某个日期会得到错误的结果。
Etc/GMT±X
区域主要用于不可定位的场景,例如跟踪海上船上的时间-不适用于陆地上的人口稠密位置。
如Mason's answer所示,您应该使用localize
函数而不是replace
来分配时区。 in the pytz documentation对此进行了介绍。