【问题标题】:'Europe/Madrid' timezone doesn't match 'Etc/GMT+1'“欧洲/马德里”时区与“Etc/GMT+1”不匹配
【发布时间】:2020-03-08 06:58:48
【问题描述】:

我正在尝试将 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/MadridEtc/GMT+1 得到不同的结果。为什么是这样? Europe/Madrid 应该用不同的方式使用吗,或者它可能是一个错误?

【问题讨论】:

  • 你试过.astimezone(pytz.timezone('Europe/Madrid')) 吗?
  • @luigigi 是的。问题是 today.astimezone(pytz.timezone('Europe/Madrid')).timestamp() 返回的时间戳与我开始时的时间戳相同

标签: python datetime timezone pytz


【解决方案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

【讨论】:

  • 谢谢,非常感谢!经验教训 - 阅读文档 :)
【解决方案2】:

UTC 时间戳:自 1970 年 1 月 1 日 UTC 以来的秒数。

Python 日期时间:一种用户友好的查看时间的好方法

UTC 时间戳不受时区影响,但日期时间受。

此代码采用给定的时间戳并将其转换为 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?

【讨论】:

  • 我尝试运行你的代码并得到TypeError: bad operand type for unary +: 'str'
  • 我刚刚修好了,抱歉
  • 谢谢。但是,我如何获得新的时间戳?
  • @ignoring_gravity,我最后加了转换码。
  • 其实,明白了——我可以做到new_timezone.localize(today).timestamp()。您的代码帮助我做到了这一点,所以我会接受它
猜你喜欢
  • 2020-04-21
  • 2018-09-29
  • 2016-07-11
  • 2020-06-05
  • 2012-07-05
  • 2019-04-04
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多