Mam instancję datetime Pythona, która została utworzona przy użyciu datetime.utcnow () i trwała w bazie danych.
Do wyświetlania chciałbym przekonwertować instancję datetime pobraną z bazy danych na lokalną datetime przy użyciu domyślnej lokalnej strefy czasowej (tj. Tak jakby data została utworzona przy użyciu datetime.now ()).
Jak przekonwertować datę / godzinę UTC na lokalną datę / godzinę, używając tylko standardowej biblioteki Pythona (np. Brak zależności Pytz)?
Wydaje się, że jednym rozwiązaniem byłoby użycie datetime.astimezone (tz), ale jak uzyskać domyślną lokalną strefę czasową?
python
datetime
timezone
python-datetime
Nitro Zark
źródło
źródło
Odpowiedzi:
W Python 3.3+:
W Pythonie 2/3:
Za pomocą
pytz
(oba Python 2/3):Przykład
Wynik
Python 3.3 Python 2 pytzUwaga: bierze pod uwagę czas letni i ostatnią zmianę przesunięcia utc dla strefy czasowej MSK.
Nie wiem, czy rozwiązania inne niż pytz działają w systemie Windows.
źródło
.normalize()
ponieważ źródłową strefą czasową dla.astimezone()
jest UTC.TypeError: replace() takes no keyword arguments
Pojawia się, gdy próbuję rozwiązania pytz.local_dt.replace(tzinfo=None).astimezone(tz=timezone.utc)
Nie można tego zrobić tylko ze standardową biblioteką, ponieważ standardowa biblioteka nie ma żadnych stref czasowych. Potrzebujesz pytza lub dateutil .
Lub cóż, możesz to zrobić bez pytza lub dateutil, wdrażając własne strefy czasowe. Ale to byłoby głupie.
źródło
Nie możesz tego zrobić ze standardową biblioteką. Za pomocą modułu pytz możesz przekonwertować dowolny naiwny / świadomy obiekt datetime na dowolną inną strefę czasową. Zobaczmy przykłady użycia Pythona 3.
Aby przekonwertować naiwny obiekt do jakiejkolwiek innej strefie czasowej, najpierw trzeba przekształcić go w świadomy obiektu datetime. Możesz użyć tej
replace
metody do konwersji naiwnego obiektu datetime na znany obiekt datetime. Następnie, aby przekonwertować świadomy obiekt datetime na dowolną inną strefę czasową, możesz użyćastimezone
metody.Zmienna
pytz.all_timezones
podaje listę wszystkich dostępnych stref czasowych w module pytz.Ponieważ
now
metoda zwraca bieżącą datę i godzinę, dlatego najpierw należy ustawić strefę czasową obiektu datetime. Talocalize
funkcja przekształca naiwny obiekt daty i godziny w obiekt daty i godziny zgodny ze strefą czasową. Następnie możesz użyć tejastimezone
metody do przekształcenia go w inną strefę czasową.źródło
Wydaje mi się, że to rozgryzłem: oblicza liczbę sekund od epoki, a następnie konwertuje na lokalną strefę czasową za pomocą time.localtime, a następnie konwertuje strukturę czasu z powrotem na datę i godzinę ...
Poprawnie stosuje letni / zimowy czas letni:
źródło
utctotimestamp(utc_dt) -> (seconds, microseconds)
ze swojego kodu dla przejrzystości, patrz implementacja Python 2.6-3.xOpierając się na komentarzu Aleksieja. To też powinno działać dla DST.
źródło
Standardowa biblioteka Pythona nie zawiera żadnych
tzinfo
implementacji. Zawsze uważałem to za zaskakującą wadę modułu datetime.Dokumentacji dla klasy tzinfo ma pochodzić z kilku przydatnych przykładów. Poszukaj dużego bloku kodu na końcu sekcji.
źródło
os
Moduł mógł pod warunkiem, jeden dla czasu lokalnego na podstawie funkcji systemu operacyjnego.Python 3.9 dodaje
zoneinfo
moduł, więc teraz można to zrobić w następujący sposób (tylko stdlib):Europa Środkowa jest o 1 lub 2 godziny przed UTC, więc
local_aware
jest:jako
str
:System Windows nie ma systemowej bazy danych stref czasowych, dlatego potrzebny jest dodatkowy pakiet:
Istnieje backport pozwalający na użycie w Pythonie od 3.6 do 3.8 :
Następnie:
źródło
zoneinfo
tu nie potrzebujesz - zobacz pierwszą część odpowiedzi JFS (część Python3.3 +) ;-)ZoneInfo('localtime')
jest o wiele jaśniejszy niżtz=None
(w końcu można oczekiwaćtz=None
usunięcia strefy czasowej lub zwrócenia UTC zamiast czasu lokalnego).Prosty (ale może wadliwy) sposób, który działa w Pythonie 2 i 3:
Jego zaletą jest to, że napisanie funkcji odwrotnej jest banalne
źródło
time.timezone
nie uwzględnia oszczędności światła dziennego.Najłatwiejszym sposobem, jaki znalazłem, jest uzyskanie przesunięcia czasowego w miejscu, w którym się znajdujesz, a następnie odjęcie go od godziny.
To działa dla mnie w Python 3.5.2.
źródło
Oto inny sposób zmiany strefy czasowej w formacie daty i godziny (wiem, że zmarnowałem na to energię, ale nie widziałem tej strony, więc nie wiem jak) bez min. i ust. bo nie potrzebuję tego do mojego projektu:
źródło
Jest to okropny sposób na zrobienie tego, ale unika tworzenia definicji. Spełnia wymóg trzymania się podstawowej biblioteki Python3.
źródło
Użyj timedelta, aby przełączać się między strefami czasowymi. Wszystko czego potrzebujesz to przesunięcie w godzinach między strefami czasowymi. Nie musisz bawić się granicami dla wszystkich 6 elementów obiektu datetime. timedelta z łatwością radzi sobie z latami przestępnymi, stuleciami przestępnymi itp. Najpierw musisz
Jeśli
offset
więc delta strefy czasowej w godzinach:timeout = timein + timedelta(hours = offset)
gdzie timein i timeout są obiektami datetime. na przykład
timein + timedelta(hours = -8)
konwertuje z GMT na PST.
Jak więc ustalić
offset
? Oto prosta funkcja, pod warunkiem, że masz tylko kilka możliwości konwersji bez użycia obiektów daty-godziny, które są „świadome” strefy czasowej, co robią niektóre inne odpowiedzi. Trochę manualnie, ale czasem klarowność jest najlepsza.Po zapoznaniu się z licznymi odpowiedziami i sprawdzeniu najściślejszego kodu, jaki mogę sobie wyobrazić (na razie) najlepiej wydaje się, że wszystkie aplikacje, w których czas jest ważny i należy uwzględnić mieszane strefy czasowe, powinny podjąć prawdziwy wysiłek, aby wszystkie obiekty datetime "świadomy". Wtedy wydaje się, że najprostszą odpowiedzią jest:
na przykład na konwersję do GMT. Oczywiście, aby przekonwertować na dowolną inną strefę czasową, lokalną lub inną, wystarczy użyć odpowiedniego ciągu strefy czasowej, który rozumie Pytz (z pytz.all_timezones). Uwzględniany jest także czas letni.
źródło