使用 pytz 和 datetime 在 python 中获取 27/02/2019 00:00 US/Eastern 的时间戳

Posted

技术标签:

【中文标题】使用 pytz 和 datetime 在 python 中获取 27/02/2019 00:00 US/Eastern 的时间戳【英文标题】:Get timestamp for 27/02/2019 00:00 US/Eastern in python using pytz and datetime 【发布时间】:2019-07-21 14:08:12 【问题描述】:

我有以下字符串:

27/02/2019

在程序中知道这些日期对应于纽约时区,我想得到对应的时间戳

27/02/2019 00:00 US/Eastern

我试过了:

import datetime
import pytz

exchange_tz = pytz.timezone('US/Eastern')
_period1 = datetime.datetime(2019,2,27)
_period1_localized = exchange_tz.localize(_period1)
_period1_ts = int((_period1_localized - datetime.datetime(1970, 1, 1, tzinfo=exchange_tz)).total_seconds()) 

>>> _period1_ts
1551225600

但这给出了对应的时间戳:

27/02/2019 00:00 UTC

我使用此服务检查了1551225600 时间戳对应于27/02/2019 00:00 UTC 而不是27/02/2019 00:00 US/Eastern

https://www.epochconverter.com/

我做错了什么?

【问题讨论】:

如何将时间戳转换为显示的日期?我们需要一个minimal reproducible example。 我得到 1551225600,据我所知,它对应于 27/02/2019 00:00 UTC 时间,而不是 27/02/2019 00:00 美国/东部时间。这是最小的、完整的和可验证的。 我在该网站上没有看到可以指定“人类日期”应转换为的特定时区的任何地方 - 所以我不同意这是用于验证的权威测试. 时间戳是 UTC - 据我所知 - 如果您输入由网站中的代码生成的时间戳,您将获得问题中所述的带有时区的时间戳。无论如何,我自己发现了这个问题。我确信有更多“权威”的方法可以将时间戳转换为基于时区的人类可读日期。随意贡献一个。 【参考方案1】:

以防万一它对其他人有所帮助,我发现错误位于此处:

_period1_ts = int((_period1_localized - datetime.datetime(1970, 1, 1, tzinfo=exchange_tz)).total_seconds())

它应使用 UTC 时区作为 EPOCH 时间:

_period1_ts = int((_period1_localized - datetime.datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds())

通过这样做你得到1551243600作为时间戳,它对应于Wednesday, 27 February 2019 05:00:00 UTC,实际上是27/02/2019 00:00 US/Eastern time

上面带有这个修正的代码可用于从本地化的日期时间获取时间戳。

【讨论】:

以上是关于使用 pytz 和 datetime 在 python 中获取 27/02/2019 00:00 US/Eastern 的时间戳的主要内容,如果未能解决你的问题,请参考以下文章

pytz 和 datetime 奇怪的行为 - 可能的错误?

何时使用 datetime.utcnow() 或 datetime.now(tz=pytz.utc).replace(tzinfo=None)

python模块-pytz时区转换

使用 pytz 进行日期时间时区转换

使用 pytz 进行日期时间和时区转换 - 令人兴奋的行为

使用 pytz 进行日期时间和时区转换 - 令人兴奋的行为