Jak przekonwertować ciąg datetime w czasie lokalnym na ciąg w czasie UTC ?
Jestem pewien, że już to zrobiłem, ale nie mogę tego znaleźć, więc mam nadzieję, że pomoże mi (i innym) zrobić to w przyszłości.
Wyjaśnienie : Na przykład, jeśli mam 2008-09-17 14:02:00
w mojej lokalnej strefy czasowej ( +10
), chciałbym aby wygenerować ciąg z równoważnego UTC
czasu: 2008-09-17 04:02:00
.
Ponadto z http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ zauważ, że ogólnie nie jest to możliwe, ponieważ w przypadku DST i innych problemów nie ma unikalnej konwersji z czasu lokalnego na Czas UTC.
Odpowiedzi:
Najpierw przeanalizuj ciąg znaków w naiwny obiekt typu data-godzina. Jest to przykład
datetime.datetime
bez dołączonej informacji o strefie czasowej.datetime.strptime
Informacje na temat analizowania ciągu daty można znaleźć w dokumentacji .Użyj
pytz
modułu, który zawiera pełną listę stref czasowych + UTC. Dowiedz się, czym jest lokalna strefa czasowa, zbuduj z niej obiekt strefy czasowej oraz manipuluj nim i dołącz go do naiwnej daty i godziny.Na koniec użyj
datetime.astimezone()
metody do konwersji daty i godziny na UTC.Kod źródłowy, przy użyciu lokalnej strefy czasowej „America / Los_Angeles”, dla ciągu „2001-2-3 10:11:12”:
Stamtąd możesz użyć tej
strftime()
metody, aby sformatować datę / godzinę UTC zgodnie z potrzebami:źródło
tzlocal.get_localzone()
aby uzyskać lokalną strefę czasową jakopytz
obiekt tzinfoZa pomocą funkcji utcnow () modułu datetime można uzyskać bieżący czas UTC.
Jak wspomniany wyżej link przez Toma: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ mówi:
UWAGA - Jeśli któreś z twoich danych znajdują się w regionie, który korzysta z DST, skorzystaj
pytz
i spójrz na odpowiedź Johna Millikina.Jeśli chcesz uzyskać czas UTC z danego ciągu i masz szczęście, że jesteś w regionie świata, który albo nie używa DST, albo masz dane, które są przesunięte tylko w stosunku do UTC bez zastosowania DST:
-> wykorzystując czas lokalny jako podstawę wartości przesunięcia:
-> Lub, ze znanego przesunięcia, za pomocą datetime.timedelta ():
AKTUALIZACJA:
Ponieważ Python 3.2
datetime.timezone
jest dostępny. Możesz wygenerować obiekt datetime rozpoznający strefę czasową za pomocą poniższego polecenia:Jeśli jesteś gotowy na konwersje w strefie czasowej, przeczytaj to:
https://medium.com/@eleroy/10-things-you-need-to-know-about-date-and-time-in-python-with-datetime-pytz-dateutil-timedelta-309bfbafb3f7
źródło
tzinfo.utcoffset() must return a whole number of minutes
.Dzięki @rofly, pełna konwersja z łańcucha na łańcuch jest następująca:
Moje podsumowanie funkcji
time
/calendar
:time.strptime
string -> krotka (nie zastosowano strefy czasowej, więc dopasowuje ciąg)
time.mktime
krotka czasu lokalnego -> sekund od epoki (zawsze czas lokalny)
time.gmtime
sekund od epoki -> krotka w UTC
i
calendar.timegm
krotka w UTC -> sekund od epoki
time.localtime
sekund od epoki -> krotka w lokalnej strefie czasowej
źródło
(always local time)
wydaje się być niepoprawny: wejściem do mktime () jest czas lokalny, wyjściem jest sekunda od epoki (1970-01-01 00:00:00 +0000 (UTC)
), która nie zależy od strefy czasowej.Oto podsumowanie typowych konwersji czasu w języku Python.
Niektóre metody upuszczają ułamki sekund i są oznaczone (s) .
ts = (d - epoch) / unit
Zamiast tego można użyć jawnej formuły, takiej jak (dzięki jfs).calendar.timegm(struct_time)
calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
(wyjątek podczas przejść DST, patrz komentarz od jfs)
calendar.timegm(dt.utctimetuple())
calendar.timegm(dt.utctimetuple())
time.gmtime(t)
(patrz komentarz od jfs)
stz.localize(dt, is_dst=None).utctimetuple()
(wyjątek podczas przejść DST, patrz komentarz JFS)
dt.utctimetuple()
dt.utctimetuple()
datetime.fromtimestamp(t, None)
(może się nie powieść w niektórych warunkach, patrz komentarz JFS poniżej)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
(nie może reprezentować sekund przestępnych, patrz komentarz od jfs)
dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
dt.astimezone(tz).replace(tzinfo=None)
datetime.utcfromtimestamp(t)
datetime.datetime(*struct_time[:6])
(nie może reprezentować sekund przestępnych, patrz komentarz JFS)
stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
(wyjątek podczas przejść DST, patrz komentarz JFS)
dt.astimezone(UTC).replace(tzinfo=None)
datetime.fromtimestamp(t, tz)
(może się nie powieść w strefach czasowych innych niż pytz)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
(nie może reprezentować sekund przestępnych, patrz komentarz od jfs)
stz.localize(dt, is_dst=None)
(wyjątek podczas przejść DST, patrz komentarz od jfs)
dt.replace(tzinfo=UTC)
Źródło: taaviburns.ca
źródło
fromtimestamp(t, None)
może się nie powieść, jeśli lokalna strefa czasowa miała inne przesunięcie utc w,t
a biblioteka C nie ma dostępu do bazy danych tz na danej platformie. Możesz użyć,tzlocal.get_localzone()
aby dostarczyć tzdata w przenośny sposób. (2)fromtimestamp(t, tz)
może się nie powieść w strefach czasowych niebędących pytzami. (3)datetime(*struct_time[:6])
brakuje*
. (4)timegm()
,utctimetuple()
,struct_time
opartych roztwór kropli ułamki sekundy. Można użyć wyraźnego wzoru, takie jak:ts = (d - epoch) / unit
zamiast.stz.localize(dt, is_dst=None)
podnosi wyjątek dla niejednoznacznych lub nieistniejących czasów lokalnych, np. Podczas przejść DST. Aby uniknąć wyjątku, użyj,stz.normalize(stz.localize(dt))
który może zwrócić nieprecyzyjne wyniki. (6) datetime () nie może reprezentować sekundy przestępnej. Najpierw zamieństruct_time
na „sekundy od epoki” jako obejście. (7) wtime.gmtime(t)
odróżnieniu od tych, którecalendar.timegm()
mogą oczekiwać danych innych niż POSIX, jeśli używana jest „właściwa” strefa czasowa. Zamiast tego użyj jawnej formuły, jeśli dane wejściowe to POSIX:gmtime = lambda t: datetime(1970,1,1, tzinfo=utc) + timedelta(seconds=t)
<table>
tagi. Przepraszamy. Jest to celowe i zgodne z projektem. Jeśli potrzebujesz szybkiej i brudnej„ tabeli ”, użyj<pre>
i układu ASCII.” Nie sądzę, aby tabela ASCII była bardziej czytelna niż powyższa lista.Źródło: http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html
Przykładowe użycie z bd808 : Jeśli źródłem jest
datetime.datetime
obiektt
, wywołaj jako:źródło
t
, wywołaj jako: local_to_utc (t.timetuple ()).timetuple()
zestawy połączeńtm_isdst
do-1
; istnieje 50% szans namktime()
niepowodzenie podczas przejścia DST.Mam szczęście z dateutil (który jest powszechnie zalecany w SO w przypadku innych powiązanych pytań):
(Kod powstał na podstawie tej odpowiedzi do Konwertuj ciąg danych UTC na lokalny czas danych )
źródło
dateutil
może się nie powieść w przeszłości, jeśli lokalna strefa czasowa miała inne przesunięcie utc niż (niezwiązane z przejściami DST) w systemach, w których implementacja nie korzysta z historycznej bazy danych stref czasowych (zwłaszcza Windows).pytz
+tzlocal
można zamiast tego użyć.Jeszcze jeden przykład z pytzem, ale zawiera localize (), który uratował mi dzień.
źródło
Miałem największy sukces z python-dateutil :
źródło
dateutil
może zawieść w przeszłościźródło
mktime(dt.timetuple())
może zawieść podczas przejścia DST . JestLocalTimezone
w dokumentach (działa dla najnowszej definicji strefy czasowej, ale może się nie powieść w przypadku przeszłych dat (niezwiązanych z DST))jeśli wolisz datetime.datetime:
źródło
mktime()
oczekuje czasu lokalnego jako danych wejściowych.fromtimestamp()
zwraca czas lokalny, nie utc. Jeśli to naprawisz, zobacz te dodatkowe problemy (na przykładdateutil
rozwiązanie tylko dla stdlib może się nie powieść)Prosty
Zrobiłem tak:
Fantazyjne wdrożenie
Jeśli chcesz się podoba, możesz zmienić to w funktor:
Wynik:
źródło
Możesz to zrobić za pomocą:
źródło
Co powiesz na -
jeśli jest sekunda,
None
to konwertuje czas lokalny na czas UTC, w przeciwnym razie konwertuje upływ czasu na UTC.źródło
Do poruszania się przy świetle dziennym itp.
Żadna z powyższych odpowiedzi nie pomogła mi szczególnie. Poniższy kod działa dla GMT.
źródło
Korzystanie z http://crsmithdev.com/arrow/
Ta biblioteka ułatwia życie :)
źródło
Tutaj znalazłem najlepszą odpowiedź na inne pytanie . Używa tylko bibliotek wbudowanych w Pythona i nie wymaga wprowadzania lokalnej strefy czasowej (w moim przypadku wymaganie)
Ponownie zamieszczam odpowiedź tutaj, ponieważ to pytanie pojawia się w Google zamiast połączonego pytania, w zależności od słów kluczowych wyszukiwania.
źródło
Mam ten kod w jednym z moich projektów:
źródło
W python3:
pip install python-dateutil
źródło
from dateutil import tz
Co powiesz na -
jeśli jest sekunda,
None
to konwertuje czas lokalny na czas UTC, w przeciwnym razie konwertuje upływ czasu na UTC.źródło