将时区分配给Python日期时间

将时区分配给Python日期时间,python,datetime,pytz,Python,Datetime,Pytz,假设我的时区小于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 到目前为止,一切顺利。现在,我想给这个对象分配一个时区。看来我要么用要么用 第一: dtAware1 = dtUnaware.repla

假设我的时区小于
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 
到目前为止,一切顺利。现在,我想给这个对象分配一个时区。看来我要么用要么用

第一:

dtAware1 = dtUnaware.replace(tzinfo=pytz.timezone('Asia/Jerusalem'))
print(dtAware1.strftime(fmt))
返回:
1979-02-2006:00:00LMT+0221
。第二:

dtAware2 = pytz.timezone('Asia/Jerusalem').localize(dtUnaware, is_dst=None)
print(dtAware2.strftime(fmt))
返回
1979-02-2006:00:00ist+0200

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

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


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

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


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

这是一个很好的解释。可能值得一提的是
localize()
是_dst
参数,用于处理不明确且不存在的本地时间。另外,
normalize()
方法可以在
localize()
之后用于不存在的本地时间。