Проверка, является ли объект datetime в mongodb в формате UTC или нет в python - PullRequest
5 голосов
/ 27 июля 2011

В mongodb поле с именем joining_date отображается как

"Sun Dec 19 2010 05:35:55 GMT+0000 (UTC)"

Это, как вы видите, является датой UTC.

Но то же поле при доступе из pymongo выглядит как

 datetime.datetime(2010, 12, 19, 5, 35, 55, 286000)

Из python мне нужно проверить, что дата в формате utc или нет.

Проблема: я получаю странный результат, как показано ниже

v = datetime(2010, 12, 19, 5, 35, 55, 286000)
v.tzinfo == pytz.utc # Returns False !..why ?

Как вернуть исходную строку Sun Dec 19 2010 05:35:55 GMT+0000 (UTC) из datetime.datetime(2010, 12, 19, 5, 35, 55, 286000) или как проверить, является ли datetime.datetime(2010, 12, 19, 5, 35, 55, 286000)в формате UTC или нет?

Ответы [ 2 ]

11 голосов
/ 13 августа 2011

datetime объекты, возвращаемые pymongo, всегда представляют время в UTC, так же как даты, хранящиеся в MongoDB, всегда сохраняются как (то есть предполагается, что в) UTC.

pymongo может автоматически преобразовать ваши datetime s в информацию о часовом поясе, если вы установите флаг tz_info на True при создании Connection. Затем вы можете использовать метод datetime s astimezone() для преобразования в другой часовой пояс, если хотите.

1 голос
/ 27 июля 2011

Цитируя документацию PyMongo:

Все даты, полученные с сервера (независимо от того, какую версию драйвера вы используете), будут наивными и обозначают UTC.

т.е. v.tzinfo is None.Вас бы предупредили об этом, если бы вы попытались преобразовать их в другой часовой пояс:

>>> v.astimezone(pytz.timezone("US/Eastern"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: astimezone() cannot be applied to a naive datetime

Однако вы можете получить дату и время с указанием часового пояса, выполнив datetime(v.year, v.month, v.day, v.hour, v.minute, v.second, v.microsecond, pytz.utc).В этом случае ваш оригинальный код будет работать:

v = datetime(2010, 12, 19, 5, 35, 55, 286000, pytz.utc)
v.tzinfo == pytz.utc # Returns True
...