pytz US/Eastern 来回转换时间戳

pytz US/Eastern converting timestamps back and forth

来自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()函数,但我不确定这是否适用于这种情况。

When using US/Eastern in pytz, does it refer to ET, EST or EDT?. Does it take into consideration the EST/EDT time change?

这些是 IANA(又名 TZDB、Olson 等)时区标识符。 US/Eastern 是 link/alias 到 America/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.