如何在 Python 中創建時區感知日期時間對象?

| | | | | | | | | | | | | | | | | | |

我需要做什麼

我有一個不知道時區的日期時間對象,我需要在其中添加一個時區以便能夠與其他時區進行比較時區感知的日期時間對象。我不想將我的整個應用程序轉換為不知道這個遺留案例的時區。

我嘗試了什麼

首先,演示問題:

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] on darwin , “copyright”, “credits” 或 “license” 以獲取更多信息。>>> import datetime >>> import pytz >>> unaware = datetime.datetime(2011,8 ,15,8,15,12,0) >>> 不知道 datetime.datetime(2011, 8, 15, 8, 15, 12) >>> 知道 = datetime.datetime(2011,8, 15,8,15,12,0,pytz.UTC)>>> 知道 datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)>>>知道 == 不知道 Traceback(最近一次調用最後一次):文件“<stdin>”,第 1 行,在 <module>TypeError:can"t compare offset-naive 和 offset-aware datetimes 

首先,我嘗試了 astimezone:

>>> unaware.astimezone(pytz.UTC) Traceback(最近一次調用最後一次):文件“<stdin>”,第 1 行,在 <module> ValueError: astimezone() 不能應用於天真的日期時間>>> 

失敗並不奇怪,因為它實際上是在嘗試進行轉換。替換似乎是一個更好的選擇(根據 >>> unaware.replace(tzinfo=pytz.UTC) datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)>>>不知道 == 知道 Traceback(最近一次調用最後一次):文件“<stdin>”,第 1 行,在 <module> TypeError: can"t compare offset-naive and offset-aware datetimes >>>

但如你所見,replace 似乎設置了 tzinfo,但不讓對象知道。我準備回退到在解析輸入字符串之前修改輸入字符串以擁有一個時區(我正在使用 dateutil 進行解析,如果這很重要的話),但這看起來非常笨拙。

另外,我已經在 Python 2.6 和 Python 2.7 中嘗試過,結果相同。

上下文

我正在為一些數據文件編寫解析器。我需要支持一種舊格式,其中日期字符串沒有時區指示符。我已經修復了數據源,但我仍然需要支持遺留數據格式。由於各種業務 BS 原因,不能一次性轉換遺留數據。雖然總的來說,我不喜歡硬的想法- 編碼一個默認時區,在這種情況下,它似乎是最好的選擇。我有理由相信所有有問題的遺留數據都是 UTC,所以我準備接受在這種情況下默認時區的風險。