2014-02-16 55 views
2

如何反序列化時區感知的日期時間對象? PYYAML會自動以ISO格式保存它們,但在加載時會丟棄時區信息。使用str(my_datetime_object)會生成正確的ISO字符串,但日期時間模塊沒有乾淨的方式將其轉換回日期時間對象。 (strftime的無ISO兼容的時區格式)反序列化Python意識到的日期時間

dateutil.parser.parse做一些奇怪的是還是不對:

In [113]: x 
Out[113]: datetime.datetime(2014, 2, 15, 21, 58, 25, 866385, tzinfo=<DstTzInfo 'Europe/Athens' EET+2:00:00 STD>) 

In [114]: str(x) 
Out[114]: '2014-02-15 21:58:25.866385+02:00' 

In [115]: dateutil.parser.parse(str(x)) 
Out[115]: datetime.datetime(2014, 2, 15, 21, 58, 25, 866385, tzinfo=tzoffset(None, 7200)) 
+2

它是一個正確的結果。 '7200 = 2 * 60 * 60 = hour_offset * 60 *分鐘/小時* 60 *秒/分鐘。它不知道你在Athen中,因爲這是一個字符串,當信息沒有顯示在字符串中時信息就會丟失。你將需要一個格式,也允許城市。 – User

+0

你是什麼意思「反序列化時區感知日期時間對象」?你想把它轉換成一個已知的時區,或者只是將它輸出爲字符串? –

+1

可能的重複[如何將ISO 8601日期時間字符串轉換爲Python日期時間對象?](http://stackoverflow.com/questions/969285/how-do-i-translate-a-iso-8601-datetime- string-into-python-datetime-object) – Jacinda

回答

1

您應該序列這一個日期時間和時區。時區應該存儲爲時區名稱,在這種情況下爲'Europe/Athens'。你使用什麼格式的日期時間不那麼重要,但我建議序列化日期時間作爲一個單獨的字段從時區,並使用UTC,明確如此。這看起來更加明確的完全取決於您的其他seialization格式的外觀。

例如:

{datetime: "2014-02-15 19:58:25.866385+00:00", timezone: "Europe/Athens"} 
+0

獲得時區id,'x.tzinfo.zone'可以和pytz時區一起使用(比如在這種情況下)。如果將datetime序列化爲UTC時間,則可以調用'utc_aware.astimezone(tz)',以便在'tz'時區中獲取有意識的日期時間對象。 – jfs