代码之家  ›  专栏  ›  技术社区  ›  Mattijn

GMT时间戳的固定偏移量规范

  •  0
  • Mattijn  · 技术社区  · 7 年前

    我的数据与格林威治标准时间(GMT)中的时间戳一起存储:

    import pandas as pd
    import pytz
    
    # data is stored in UTC 
    timestamp_utc = pd.Timestamp('2018-1-18 23:00', tz='Etc/GMT')
    print(timestamp_utc)
    2018-01-18 23:00:00+00:00
    

    现在,我想查看中欧时间(CET)的数据,该时间与格林尼治标准时间的固定时差为+1小时。

    # Central European Time (CET)
    cet_tz = pytz.timezone('Etc/GMT+1')
    
    timestamp_cet = timestamp_utc.astimezone(cet_tz)
    print(timestamp_cet)
    2018-01-18 22:00:00-01:00
    

    这对我来说是很混乱的,我本该预料到的。 2018-01-19 00:00:00+01:00

    documentation 以下是关于固定偏移量的说明:

    固定偏移

    上面提到的“etc/gmt*”时区提供了固定的 偏移规格,但注意反直观标志 公约。

    有人能解释一下这是什么意思吗?这真的意味着,如果我想的话 Etc/GMT+1 我必须这样做 Etc/GMT-1 ?

    因为:

    print(timestamp_utc.astimezone(pytz.timezone('Etc/GMT-1')))
    

    导致预期:

    2018-01-19 00:00:00+01:00
    

    有人能解释这种反直觉行为的逻辑吗?

    编辑

    我想我可以用 pytz.timezone('CET') 中欧时间。但在夏季夏令时,这张地图显示了CEST。( UTC+2:00 )因此不适合用作真正的CET时区。此外,时区 CET 也是 deprecated

    所以, ETC/GMT-1 代表真正的中欧时间的典型方式是( UTC+01:00 )。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Matt Johnson-Pint    7 年前

    这个 Etc/GMT* 区域设计为符合POSIX,以便向后兼容 TZ 系统上未安装完整时区数据库的环境变量。POSIX时区规则的偏移符号与我们通常期望的ISO 8601标准相反。

    这在评论中有解释 in the tz database :

    与区域名称中的posix-tz设置保持一致,即使这与许多人所期望的相反。POSIX在格林威治以西有阳性信号,但许多人期望在格林威治以东有阳性信号。例如,tz='etc/gmt+4'使用缩写“-04”,与UT(即格林威治以西)后4小时相对应,尽管许多人认为这意味着比UT(即格林威治以东)提前4小时。

    它也被描述了 on Wikipedia :

    “etc”的特殊区域用于某些行政区域,特别是表示协调世界时的“etc/utc”。为了符合POSIX样式,那些以“etc/gmt”开头的区域名的符号与标准ISO 8601惯例相反。在“ETC”区域,格林尼治标准时间以西的区域有一个正号,以东的区域有一个负号(例如,“ETC/GMT-14”比格林尼治标准时间提前14小时)。

    一般来说,对于陆地上有人居住的位置,您应该更喜欢使用基于位置的区域标识符。例如,使用 Europe/Amsterdam 在荷兰的时间。这有一个优点,即在正确的时间点,以及任何以前的历史转变,正确地在CET和CEST之间切换。

    储量利用 ETC/GMTM* 边缘情况区域,如海上船舶的跟踪时间。

    您可以查看TZDB区域名称的完整列表 here

    推荐文章