2009-11-08 11 views

Odpowiedz

338

Korzystając time.mktime() konwertowania krotki czas (w localtime) w sekundach od Epoki, następnie użyj datetime.fromtimestamp(), aby uzyskać obiekt datetime.

from time import mktime 
from datetime import datetime 

dt = datetime.fromtimestamp(mktime(struct)) 
+1

@Nadia Dlaczego tak jest? Twój wydaje się prostszy i wymaga mniejszej liczby modułów. –

+28

Pamiętaj, że to się nie uda przed rokiem 1900. Współcześni ludzie nigdy nie pamiętają tego ograniczenia! – mlissner

+2

spowoduje to utratę danych 'tm_isdst'? Myślę, że tak, wynikowy obiekt datetime pozostaje naiwny do tego stopnia, aby zwrócić 'None' na' .dst() 'nawet jeśli' struct.tm_isdst' jest '1'. – n611x007

111

tak:

>>> structTime = time.localtime() 
>>> datetime.datetime(*structTime[:6]) 
datetime.datetime(2009, 11, 8, 20, 32, 35) 
+2

Nie zapomnij o #import czas, datetime – jhwist

+7

@jhwist - niektóre rzeczy można zaufać ludziom, aby samodzielnie to zrozumieć :) – orip

+1

co robi * przed strukturą structTime? – rodling

31

To nie jest bezpośrednia odpowiedź na twoje pytanie (na co odpowiedź została już odebrana). Jednakże, kilkakrotnie ugryzłszy mnie w fundament, nie mogę podkreślić wystarczająco, że powinienem uważnie przyjrzeć się temu, co zapewnia obiekt time.struct_time, w porównaniu do innych pól czasowych.

Zakładając, że masz zarówno obiekt time.struct_time, jak i jakiś inny ciąg daty/czasu, porównaj oba i upewnij się, że nie tracisz danych i nieumyślnie tworząc naiwny obiekt datetime, kiedy możesz zrobić inaczej.

Na przykład doskonały moduł feedparser zwróci „opublikował” pola i może zwrócić obiekt time.struct_time w „published_parsed” pola:

time.struct_time(tm_year=2013, tm_mon=9, tm_mday=9, tm_hour=23, tm_min=57, tm_sec=42, tm_wday=0, tm_yday=252, tm_isdst=0) 

Zauważmy teraz, co rzeczywiście się z „opublikowany "pole.

Mon, 09 Sep 2013 19:57:42 -0400 

Przez brodę Stallman Informacje o strefie czasowej!

W tym przypadku, leniwy człowiek może chcieć wykorzystać doskonałą moduł dateutil aby informacje Strefa czasowa:

from dateutil import parser 
dt = parser.parse(entry["published"]) 
print "published", entry["published"]) 
print "dt", dt 
print "utcoffset", dt.utcoffset() 
print "tzinfo", dt.tzinfo 
print "dst", dt.dst() 

co daje nam:

published Mon, 09 Sep 2013 19:57:42 -0400 
dt 2013-09-09 19:57:42-04:00 
utcoffset -1 day, 20:00:00 
tzinfo tzoffset(None, -14400) 
dst 0:00:00 

Można by następnie użyć timezone- świadomy obiekt datetime, który normalizuje cały czas UTC lub coś, co wydaje ci się niesamowite.

+4

Wszystkie pola '* _parsed' z feedparsed są już znormalizowane do UTC, jak można sprawdzić w [dokumentacji do analizy daty] (https: // pythonhosted.org/feedparser/date-parsing.html?highlight=utc#supporting-additional-date-formats), więc jest to zbędne. – itorres

Powiązane problemy