2014-02-16 7 views
2

Как вы несериализуете объект datetime, учитывающий часовой пояс? PYYAML автоматически сохранит их в формате ISO, но при загрузке снимет информацию о часовом поясе. Использование str (my_datetime_object) создает правильную строку ISO, но модуль datetime не имеет чистого способа конвертировать его обратно в объект datetime. (STRFTIME не имеет формат временных зон ISO-совместимый)Unserialize datetime, известное как 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 * секунд/минут'. Он не может знать, что вы находитесь в Афине, поскольку это строка, и информация теряется, когда она не отображается в строке. Вам понадобится формат, который также позволяет городу. – User

+0

Что вы подразумеваете под «unserialize объект datetime, поддерживающий часовой пояс»? Вы хотите преобразовать его в известный часовой пояс или просто вывести его как строку? –

+1

Возможный дубликат [Как перевести строку даты и времени ISO 8601 в объект даты и времени Python?] (Http://stackoverflow.com/questions/969285/how-do-i-translate-a-iso-8601-datetime- string-to-a-python-datetime-object) – Jacinda

ответ

1

Вы должны сериализовать это Задан и часовой пояс. Часовой пояс следует хранить как имя часового пояса, в данном случае 'Europe/Athens'. Какой формат, который вы используете для даты и времени, менее важен, но я бы рекомендовал сериализовать datetime как отдельное поле из часового пояса и использовать UTC и явно так. Как это выглядит более явно, полностью зависит от того, как выглядит остальная часть вашего формата слияния.

Например:

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

, чтобы получить идентификатор часового пояса, 'x.tzinfo.zone' может использоваться с часами времени pytz (например, в данном случае). Если datetime сериализуется как время UTC, тогда можно вызвать 'utc_aware.astimezone (tz)', чтобы получить известный объект datetime в часовом поясе 'tz'. – jfs