2011-07-27 4 views
5

W mongodb, pole o nazwie joining_date pojawia się jakoSprawdzanie, czy obiekt datetime w MongoDB jest w formacie UTC lub nie z pytona

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

ta jak widać jest data UTC. Ale to samo pole, gdy dostępne z pymongo pojawia

jak

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

Od pytona muszę sprawdzić, czy data jest w formacie UTC czy nie.

Problem: mam dziwny wynik, jak pokazano poniżej

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

Jak mogę odzyskać oryginalny ciąg Sun Dec 19 2010 05:35:55 GMT+0000 (UTC) z datetime.datetime(2010, 12, 19, 5, 35, 55, 286000) lub w jaki sposób mogę sprawdzić, czy datetime.datetime(2010, 12, 19, 5, 35, 55, 286000) jest w formacie UTC czy nie?

+0

czy twoja data jest zapisana jako ciąg lub obiekt daty w mongodb? czy pymongo automatycznie "marnuje" ciąg znaków na obiekt daty? – vgoklani

Odpowiedz

1

Cytując dokumentację PyMongo:

Wszystkie datetimes pobierane z serwera (bez względu na wersję sterownika używasz) będzie naiwny i reprezentują UTC.

tj. v.tzinfo is None. Byś został ostrzeżony o tym, gdybyś próbował konwertować je do innej strefy czasowej:

>>> 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 

Jednak można uzyskać strefy czasowej świadomy datetime wykonując datetime(v.year, v.month, v.day, v.hour, v.minute, v.second, v.microsecond, pytz.utc). W tym przypadku, oryginalny kod będzie działać:

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

Nie jestem pewien, jaka wersja czytanej dokumentacji pymongo, ale od 1.8, pymongo opcjonalnie obsługuje powrót zwracających się do strefy czasowej 'datetime's. W obecnej wersji (2.0) możesz ustawić to podczas tworzenia 'Connection' z parametrem' tz_aware' (akceptuje boolean). Kiedy 'tz_aware' jest' True', wszystkie 'datetimes' są nadal zwracane w UTC, ale mają' tzinfo' ustawione na stałe-przesunięcie (0). – dcrosta

10

datetime obiektów zwracanych przez pymongo zawsze reprezentują czas w UTC, podobnie jak terminy zapisane w MongoDB są zawsze zapisywane jako (czyli wyniesie w) UTC.

pymongo można przekonwertować datetime s automatycznie będzie strefa czasowa świadomi jeśli ustawić flagę tz_info do True podczas tworzenia Connection. Następnie możesz użyć metody datetime s astimezone() do konwersji na inną strefę czasową, jeśli chcesz.

+3

Czy flaga 'tz_info' powinna być' tz_aware'? – alswl

+0

Parametry @alswl, '' 'tz_info''' powinny mieć wartość True. –

Powiązane problemy