【问题标题】:DST lost in datetime strptime with pytz Python使用 pytz Python 在日期时间 strptime 中丢失 DST
【发布时间】:2014-08-17 22:08:24
【问题描述】:

我有一个字符串格式

frmt = "%m-%d-%Y %I:%M:%S %p"

当我将 now() 转换为这种格式并返回时,我会丢失 DST。

print datetime.strptime(datetime.now().strftime(frmt), frmt).replace(tzinfo=pytz.timezone("US/Eastern")).dst()


print datetime.now(tz=pytz.timezone("US/Eastern")).dst()

第一次打印返回 1:00:00,第二次打印返回 0:00:00。
使用 datetime.strptime 时有没有办法保留夏令时?

【问题讨论】:

  • 我不确定你为什么在这里使用字符串,因为你的例子只是显示“现在”。如果这确实是一个要求,那么请显示以特定字符串开头,我会更新我的答案。
  • @MattJohnson 数据来自 API 作为字符串。我使用now 来解释这个问题。示例字符串为“06-27-2014 07:53:01 PM”。 tz 由配置设置确定。谢谢。

标签: python datetime pytz strptime


【解决方案1】:

根据pytz documentation

这个库不同于记录在案的用于 tzinfo 实现的 Python API;如果您想创建本地挂钟时间,您需要使用本文档中记录的localize() 方法。 ...

您还应该考虑根据 UTC 以“现在”开头,而不是根据您自己计算机的时区。然后你可以转换到你想的时区。

此外,您应该使用"America/New_York" 而不是"US/Eastern",因为后者在tzdb 中仅用于向后兼容的目的。它会起作用,但不是首选。

utc_dt = pytz.utc.localize(datetime.utcnow())
eastern_dt = utc_dt.astimezone(pytz.timezone("America/New_York"))

【讨论】:

  • 原因是当你使用replace 时,tzinfo 对象没有机会进行自我调整,即使这样做了,它也无法访问日期。这是datetime API 中的一个缺陷。
  • @MarkRansom: 顺便说一句,pytz.utc 是一个特殊的时区(总是相同的 UTC 偏移量),可以与 .replace(): utc_dt = datetime.utcnow().replace(tzinfo=pytz.utc) 一起使用,即 .localize() 对于 UTC 不是必需的。虽然我更喜欢:utc_dt = datetime.now(pytz.utc) 拼写(适用于任何时区)。
猜你喜欢
  • 2011-02-09
  • 2013-06-12
  • 2016-07-12
  • 2016-08-13
  • 2014-01-17
  • 2016-12-07
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
相关资源
最近更新 更多