Mam czas w UTC, od którego chcę liczbę sekund od epoki.
Używam strftime, aby przekonwertować go na liczbę sekund. Biorąc za przykład 1 kwietnia 2012 r.
>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
1 kwietnia 2012 UTC z epoki to 1333238400, ale powyższy zwraca 1333234800, który różni się o 1 godzinę.
Wygląda więc na to, że strftime bierze pod uwagę mój czas systemowy i stosuje gdzieś zmianę strefy czasowej. Myślałem, że data i godzina była czysto naiwna?
Jak mogę to obejść? Jeśli to możliwe, unikaj importowania innych bibliotek, chyba że standardowe. (Mam obawy dotyczące przenośności).
datetime.datetime.timestamp(datetime.datetime.utcnow())
Odpowiedzi:
Jeśli chcesz przekonwertować datetime Pythona na sekundy od epoki, możesz to zrobić jawnie:
W Python 3.3+ możesz
timestamp()
zamiast tego użyć :Dlaczego nie powinieneś używać
datetime.strftime('%s')
Python tak naprawdę nie obsługuje% s jako argumentu dla strftime (jeśli sprawdzisz na http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior nie ma go na liście), jedyne powodem tego jest fakt, że Python przekazuje informacje do strftime systemu, który wykorzystuje lokalną strefę czasową.
źródło
.strftime("%s")
: nie jest obsługiwany, nie jest przenośny, może dyskretnie wygenerować zły wynik dla świadomego obiektu datetime, nie powiedzie się, jeśli dane wejściowe są w UTC (jak w pytaniu), ale lokalna strefa czasowa nie jest w UTCAttributeError: 'datetime.timedelta' object has no attribute 'total_seconds'
td.seconds + td.days*24*3600
. To odrzuca część mikrosekund.Miałem poważne problemy ze strefami czasowymi i tym podobne. Sposób, w jaki Python radzi sobie z tym wszystkim, jest dość mylący (dla mnie). Wydaje się, że wszystko działa dobrze przy użyciu modułu kalendarza (patrz linki 1 , 2 , 3 i 4 ).
źródło
aprilFirst
w tym przykładzie wystąpiła „świadoma” instancja i używała strefy czasowej innej niż strefa czasowa systemu, wynik nie byłby prawidłowy (strefa czasowa gubi się wtimetuple()
wywołaniu). Aby uzyskać właściwą odpowiedź na „świadomą” datę, możesz użyćawaredt.timestamp()
najnowszego Pythona 3. W Pythonie 2 jest trudniej; Jednym ze sposobów jest użyciearrow
biblioteki.arrow.get(awaredt).timestamp
zrobię to dobrze.datetime
obiektu, więc założyłem, że „mam czas w UTC” oznaczało, że OP miał nieświadomydatetime
obiekt, który, jak zakładano, znajdował się w UTC, dla którego chciał dostaćepoch
(jeślidatetime
zdarzyło się, że był świadomy TZ, to może rzeczywiście zmienić rzeczy). Pamiętaj też, że ta odpowiedź ma prawie 8 lat i od tego czasu wydarzyło się wiele rzeczy (arrow
na przykład została wydana w 2013 r.)źródło
time.time()
(mktime()
może się nie powieść podczas przejścia DST, gdytime.time()
nadal działa). I nie odpowiada na pytanie, chyba że lokalna strefa czasowa to UTC (dane wejściowe w pytaniu są w UTC). Nawet jeśli dane wejściowe reprezentowałyby czas lokalny,mktime()
mogą również zawieść dla przeszłych / przyszłych dat, jeśli nie będą korzystać z bazy danych tz i jeśli lokalna strefa czasowa może mieć różne przesunięcia utc na przestrzeni lat, np. Europa / Moskwa w latach 2010-2015 - - zamiast tego używaj czasu UTC (jak w pytaniu) lub obiektów daty-godziny obsługujących strefę czasową..now()
) na znacznik czasu epoki (zwrócony przezmktime()
) . Jeśli to przeczytasz; rozumiesz, dlaczego dane wejściowe UTC (użyte w pytaniu) są (o wiele) lepsze niż naiwny obiekt datetime reprezentujący czas lokalny(Przepraszam, nie pozwala mi to komentować istniejącej odpowiedzi)
źródło
jeśli potrzebujesz tylko znacznika czasu w czasie uniksowym / epoki, ta jedna linia działa:
i zależy tylko od
datetime
pracy w python2 i python3źródło
Działa to w Python 2 i 3:
Wystarczy postępować zgodnie z oficjalnymi dokumentami ... https://docs.python.org/2/library/time.html#module-time
źródło
Aby uzyskać jednoznaczne rozwiązanie niezależne od strefy czasowej, użyj biblioteki pytz.
Wyjście (liczba zmiennoprzecinkowa): 1333238400.0
źródło
W Pythonie 3.7
https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat
źródło