【问题标题】:Assign timezone to a Python datetime [duplicate]将时区分配给 Python 日期时间 [重复]
【发布时间】:2015-03-28 19:35:27
【问题描述】:

假设我有一个无时区的datetime 对象:

import datetime
import pytz
fmt = "%Y-%m-%d %H:%M:%S %Z%z"
dtUnaware = datetime.datetime(1979,2,20,6)
print(dtUnaware.strftime(fmt))

这产生:

1979-02-20 06:00:00 

到目前为止,一切都很好。现在,我想为这个对象分配一个时区。看来我可以使用datetime.replacepytz.localize

第一:

dtAware1 = dtUnaware.replace(tzinfo=pytz.timezone('Asia/Jerusalem'))
print(dtAware1.strftime(fmt))

返回:1979-02-20 06:00:00 LMT+0221。其次:

dtAware2 = pytz.timezone('Asia/Jerusalem').localize(dtUnaware, is_dst=None)
print(dtAware2.strftime(fmt))

返回1979-02-20 06:00:00 IST+0200

第一种方法有什么问题?似乎分配了错误的时区。我做错了吗?

【问题讨论】:

    标签: python datetime pytz


    【解决方案1】:

    来自 Pytz 文档:这个库不同于记录在案的 Python API tzinfo 实现;如果你想创建本地挂钟 有时您需要使用本文中记录的localize() 方法 文件......不幸的是这些 不修改 Python 日期时间就无法解决问题 实施(见 PEP-431)

    我对此的理解是pytz 时区与标准时区并不完全相同。如果你有一个真正的时区,第一种方法应该很好,但你没有。

    【讨论】:

      【解决方案2】:

      datetime API 中存在一个缺陷:当您为其分配时区时,时区没有机会知道它应该配置的日期和时间。 pytz 使用的历史数据库可以追溯到很久以前,通常是时区名称或偏移量与今天使用的不同的时期。如果没有机会调整到特定日期期间,时区的详细信息可能会出错。

      使用localize 是解决此问题的方法,因为日期和时区在函数中同时可用。

      【讨论】:

      • 一个很好的解释。可能值得一提的是localize()is_dst 参数,它处理模糊和不存在的当地时间。此外,normalize() 方法可以在 localize() 之后使用,用于不存在的本地时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 2020-11-29
      • 1970-01-01
      相关资源
      最近更新 更多