【问题标题】:Incorrect datetime conversion from America/New_York time to UTC and back to America/New_York从 America/New_York 时间到 UTC 并返回 America/New_York 的日期时间转换不正确
【发布时间】:2021-05-19 05:52:40
【问题描述】:

我正在尝试将时间从美国/纽约转换为 UTC,然后将其转换回纽约时间。但是我在使用pytz 时得到了不同的结果。

我正在这样做:

new_date = parser.parse("May 4, 2021")
new_date = new_date.replace(tzinfo=pytz.timezone("America/New_York"))
date = new_date.astimezone(pytz.timezone("UTC"))     

输出:

datetime.datetime(2021, 5, 4, 4, 56, tzinfo=<UTC>)

当我尝试将其重新转换回 纽约时间我得到这个:

date.astimezone(pytz.timezone("America/New_York"))

我明白了:

datetime.datetime(2021, 5, 4, 0, 56, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>)

我的问题是为什么会有 56 分钟的差异,可以做些什么来防止这种情况发生?

【问题讨论】:

    标签: python datetime


    【解决方案1】:

    56 分钟的差异源于 pytz 访问的数据库中的第一个条目是指 LMT(本地平均时间):

    import pytz
    t = pytz.timezone("America/New_York")
    print(repr(t))
    # <DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>
    

    您可以阅读更多here

    tl;dr - 永远不要 replace 带有来自 pytz 的时区对象的 tzinfo! 改用 localize(或 astimezone),将时区调整为日期时间对象。

    ...但是: 既然你已经使用dateutil,为什么不在这里也使用它呢:

    import dateutil
    
    new_date = dateutil.parser.parse("May 4, 2021")
    # you can safely replace with dateutil's tz objects:
    new_date = new_date.replace(tzinfo=dateutil.tz.gettz("America/New_York"))
    date = new_date.astimezone(dateutil.tz.UTC)   
    
    # date
    # datetime.datetime(2021, 5, 4, 4, 0, tzinfo=tzutc())
    
    date = date.astimezone(dateutil.tz.gettz("America/New_York"))
    # date
    # datetime.datetime(2021, 5, 4, 0, 0, tzinfo=tzfile('US/Eastern'))
    print(date)
    # 2021-05-04 00:00:00-04:00
    

    【讨论】:

    • 是的,我已经。使用相同的解决方案解决了该问题。谢谢。 :)
    【解决方案2】:

    代码按预期运行。

    没有 56 分钟的差异。时差 4 小时。

    datetime.datetime(
    2021, // 年年
    5, // 毫米
    4, // dd
    4, // hh -- 这是小时
    56, // 米
    tzinfo=)

    4 小时也恰好是 UTC 领先美国东部时间的小时数。纽约时间为 00:56 时,UTC 时间为 04:56。

    【讨论】:

    • 当我将天真的时间转换为纽约然后转换为 UTC 时,当我将其向后转换时,它应该与 UTC 相同。但我没有把它找回来。
    • 请以美国格式打印原始日期、TZ 转换日期 (UTC) 和 TZ 转换回 (US)。
    • 您可以看到我的输出,它们是否因机器而异?
    • 你只有两个。也打印原始日期时间。
    • @vvgiri:查看我在答案中链接的博客文章,了解更多关于 56 分钟差异的信息(恰好在那里......)
    猜你喜欢
    • 2017-04-29
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 2020-06-28
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多