【问题标题】:timezone conversion in PythonPython中的时区转换
【发布时间】:2013-11-24 18:19:24
【问题描述】:

我可能遗漏了一些关于时区的信息:

>>> import datetime, pytz
>>> date = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.timezone("Europe/Paris"))
>>> date.astimezone(pytz.UTC)
datetime.datetime(2013, 9, 3, 15, 51, tzinfo=<UTC>)

我期待

datetime.datetime(2013, 9, 3, 15, 00, tzinfo=<UTC>)

谁能解释一下这 51 分钟是从哪里来的?

谢谢,

让-菲利普

【问题讨论】:

    标签: python datetime timezone pytz


    【解决方案1】:

    阅读pytz documentation开头的注释;使用.localize() 方法创建时区感知的日期时间对象:

    import datetime
    import pytz
    
    naive_dt = datetime.datetime(2013,9,3,16,0)
    dt = pytz.timezone("Europe/Paris").localize(naive_dt, is_dst=None)
    
    to_s = lambda d: d.strftime('%Y-%m-%d %H:%M:%S %Z%z')
    print(to_s(dt))
    print(to_s(dt.astimezone(pytz.utc)))
    

    输出

    2013-09-03 16:00:00 CEST+0200
    2013-09-03 14:00:00 UTC+0000
    

    我不知道你为什么在这里期待15:00 UTC

    【讨论】:

      【解决方案2】:

      感谢西蒙的回答。这让我意识到我对这一切的理解是多么肤浅。以下实验让我失去了更多...

      >>> import datetime, pytz
      >>> date_paris = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.timezone("Europe/Paris"))
      >>> date_utc = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.utc)
      >>> date_paris.astimezone(pytz.utc)
      datetime.datetime(2013, 9, 3, 15, 51, tzinfo=<UTC>)
      >>> date_utc.astimezone(pytz.timezone("Europe/Paris"))
      datetime.datetime(2013, 9, 3, 18, 0, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>)
      

      为什么在一个方向而不是另一个方向转换时会显示这 9 分钟的偏移量?下面这段代码集中了所有的失望:

      >>> date_paris
      datetime.datetime(2013, 9, 3, 16, 0, tzinfo=<DstTzInfo 'Europe/Paris' PMT+0:09:00 STD>)
      >>> date_paris.astimezone(pytz.utc).astimezone(pytz.timezone("Europe/Paris"))
      datetime.datetime(2013, 9, 3, 17, 51, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>) 
      

      【讨论】:

        【解决方案3】:

        UTC 偏移量给出 (date.tzinfo.utcoffset(date)):

        datetime.timedelta(0, 540)
        

        这是 540 秒或 9 分钟。

        在法国,1911 年 3 月 11 日切换到 UTC,时钟拨回 9 分 21 秒(source 1source 2):

        直到 1911 年,巴黎比世界标准时间晚 9 分 21 秒。

        您也可以在此处 (Paris time in 1911) 看到时间从 3 月 11 日凌晨 12:01:00 到 3 月 10 日晚上 11:51:39。

        【讨论】:

        • 这看起来很奇怪..完全出乎意料
        • 好的。看来我完全误解了 UTC 到底是什么!
        • 好吧,维基百科将欧洲中部时间定义为“比协调世界时 (UTC) 提前 1 小时。与 UTC 的时间偏移可以写为 +01:00”。我完全迷路了。
        猜你喜欢
        • 2012-06-15
        • 1970-01-01
        • 2019-04-07
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        • 1970-01-01
        • 2021-11-10
        • 2015-12-17
        相关资源
        最近更新 更多