【问题标题】:pytz US/Eastern converting timestamps back and forthpytz US/Eastern 来回转换时间戳
【发布时间】:2019-07-21 11:55:05
【问题描述】:

来自time and date website

Generalized Time Zone in New York
ET  Eastern Time    UTC -5:00 / -4:00   Wed, 11:42:33

Time Zone Currently Being Used in New York
UTC -5  EST Eastern Standard Time   New York    Wed, 11:42:33

Time Zone Not Currently Being Observed in New York
UTC -4  EDT Eastern Daylight Time   10 Mar 2019

因此,由于夏令时,纽约时间基本上是美国东部时间或美国东部时间,具体取决于我们目前处于一年中的哪个时期。

在 pytz 中使用 US/Eastern 时,它是指 ET、EST 还是 EDT?是否考虑到 EST/EDT 时间变化?

我正在使用此代码获取东部时间给定日期的开始和结束的时间戳:

    import datetime
    import pytz

    session = datetime.datetime.strptime('26/02/2019', '%d/%m/%Y')
    exchange_tz = pytz.timezone('US/Eastern')
    session_localized = exchange_tz.localize(session)

    _period1 = int((session_localized - datetime.datetime(1970, 1, 1, tzinfo=exchange_tz)).total_seconds())
    _period2 = int((session_localized - datetime.datetime(1970, 1, 1, tzinfo=exchange_tz)).total_seconds()) + 24*60*60

    >>> _period1
    1551139200
    >>> _period2
    1551225600

我不能 100% 确定这些时间戳是否已正确生成。因为当我尝试将它们转换回本地化日期时间时,我得到了 1 小时的差异:

    _exchange_tz = pytz.timezone('US/Eastern')
    _exchange_ts = _exchange_tz.localize( datetime.datetime.fromtimestamp(1551139200) )

    >>> str(_exchange_ts)
    '2019-02-26 01:00:00-05:00'

据我了解,应该是2019-02-26 00:00:00。我做错了什么?

我还在pytz documentation 中读到normalize() 函数应在进行算术覆盖时使用,但我不确定这是否适用于这种情况。

【问题讨论】:

    标签: python python-2.7 datetime timezone pytz


    【解决方案1】:

    在 pytz 中使用 US/Eastern 时,它是指 ET、EST 还是 EDT?是否考虑到 EST/EDT 时间变化?

    这些是 IANA(又名 TZDB、Olson 等)时区标识符。 US/EasternAmerica/New_York 的链接/别名。两者都正确地模拟了美国东部时区的历史,包括 EST 或 EDT,具体取决于它们何时适用。

    关于您的示例,时间戳 1551139200 等于 2019-02-26T00:00:00Z (UTC)。在美国东部时间,这是2019-02-25T19:00:00-05:00。这应该是你得到的结果。您首先需要将输入值本地化为 UTC(或者在 UTC 的情况下,您可以安全地分配 tzinfo=pytz.utc)。然后使用astimezone函数转换为US/Eastern

    【讨论】:

    • 感谢您的澄清。但是我使用了localize 而不是tzinfo=exchange_tz,我得到了相同的时间戳,但在尝试将该时间戳转换回美国/东部时仍然遇到同样的问题
    • 更新了我的答案。这是两个步骤:首先让日期时间“知道”它是 UTC,然后将其转换为东部时间。否则,您错误地断言它已经在东部时间而不是 UTC。 (就 UTC 而言,Unix 时间戳总是)。
    • (对不起,如果我没有直接回答您的问题 - 您的第一段代码有一些难以理解的内容,并且似乎与第二段无关。)
    • 第一个代码块生成时间戳,稍后用于调用 Web 服务。然后,Web 服务以由两个时间戳定义的范围内的数据进行响应。您对所有时间戳总是如此的评论(这是一个强有力的主张)UTC 让我再次仔细检查所有内容(我调用的 API 没有记录)。
    • 数字时间戳,如 1551139200 始终是 UTC,或者无论如何都应该是 - 除非有人人为地(不正确地)调整它们。此外,ISO8601 格式字符串末尾的 Z 表示 UTC。如果您只有一些日期/时间值,并且它不是这两种格式中的任何一种,那么您必须以其他方式了解它的时区。
    猜你喜欢
    • 2019-07-21
    • 2017-06-15
    • 2022-01-24
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    相关资源
    最近更新 更多