Dlaczego Python 2.7 nie zawiera znaku Z (Zulu lub przesunięcia zerowego) na końcu ciągu izoformatowania obiektu daty UTC w przeciwieństwie do JavaScript?
>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'
Podczas gdy w javascript
>>> console.log(new Date().toISOString());
2013-10-29T09:38:41.341Z
datetime.datetime.utcnow().isoformat() + 'Z'
Odpowiedzi:
datetime
Obiekty Pythona nie mają domyślnie informacji o strefie czasowej, a bez niej Python faktycznie narusza specyfikację ISO 8601 ( jeśli nie podano informacji o strefie czasowej, przyjmuje się, że jest to czas lokalny ). Możesz użyć pakietu pytz, aby uzyskać domyślne strefy czasowe lub bezpośrednio podklasowaćtzinfo
siebie:Następnie możesz ręcznie dodać informacje o strefie czasowej do
utcnow()
:Zauważ, że ten jest zgodny z formatem ISO 8601, co pozwala na albo
Z
lub+00:00
jako przyrostek do UTC. Zwróć uwagę, że ta ostatnia w rzeczywistości lepiej odpowiada standardowi, z ogólnym sposobem reprezentacji stref czasowych (UTC jest przypadkiem specjalnym).źródło
Z
zamiast+00:00
?pytz
naruszatzinfo
protokół Pythona i jest niebezpieczny w użyciu! Zobacz blog.ganssle.io/articles/2018/03/pytz-fastest-footgun.htmldateutil
na pracę nie zostały zaimplementowane aż do Pythona 3.6 z PEP 495, więc powiedzieć,pytz
że nie używał standardowego interfejsu, jest niesprawiedliwe, ponieważ interfejs się zmienił. Przed zmianą jedynym sposobem, aby to zadziałało, był sposób, w jakipytz
to się stało.Opcja:
isoformat()
Python
datetime
nie obsługuje wojskowych sufiksów stref czasowych, takich jak przyrostek „Z” dla UTC. Następująca prosta zamiana łańcucha załatwia sprawę:str(d)
jest zasadniczo taki sam jakd.isoformat(sep=' ')
Zobacz: Datetime, Python Standard Library
Opcja:
strftime()
Lub możesz użyć,
strftime
aby osiągnąć ten sam efekt:Uwaga: ta opcja działa tylko wtedy, gdy wiesz, że określona data jest w czasie UTC.
Zobacz: datetime.strftime ()
Dodatkowe: strefa czasowa czytelna dla ludzi
Idąc dalej, możesz być zainteresowany wyświetlaniem czytelnych dla człowieka informacji
pytz
ostrftime
%Z
strefie czasowej wraz z flagą strefy czasowej:źródło
T
zamiast spacji?d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=datetime.timezone.utc)
w linii 2. Przy okazji, w RFC3339 jest napisane, że spacja jest „ok” (zamiast „T”).Poniższe skrypty javascript i python dają identyczne wyniki. Myślę, że właśnie tego szukasz.
JavaScript
Pyton
Wynik, jaki dają, to czas utc (zelda) sformatowany jako ciąg ISO z cyfrą znaczącą o wartości 3 milisekund i uzupełniony o Z.
źródło
W Pythonie> = 3.2 możesz po prostu użyć tego:
źródło
Z
, możesz.isoformat()[:-6] + 'Z'
Czasy danych w Pythonie są trochę niezgrabne. Użyj
arrow
.Arrow ma zasadniczo ten sam interfejs API, co datetime, ale ze strefami czasowymi i kilkoma dodatkowymi funkcjami, które powinny znajdować się w głównej bibliotece.
Format zgodny z Javascriptem można osiągnąć poprzez:
JavaScript
Date.parse
po cichu usunie mikrosekundy ze znacznika czasu.źródło
W poście jest wiele dobrych odpowiedzi, ale chciałem, aby format wyszedł dokładnie tak, jak w przypadku JavaScript. Tego właśnie używam i to działa dobrze.
źródło
źródło
Podszedłem do tego problemu z kilkoma celami:
timezone
funkcji narzędzia Django i rozszerzeniadateutil
parseraTo podejście nie zawiera przyrostka Z i nie jest używane
utcnow()
, ale jest oparte na zaleceniach zawartych w dokumentacji Pythona i przechodzi testy z Django i JavaScript.Zacznijmy od przekazania obiektu strefy czasowej UTC
datetime.now()
zamiast używaniadatetime.utcnow()
:Że wygląda dobrze, więc zobaczmy, co Django i
dateutil
myśleć:OK, obiekt datetime w Pythonie i ciąg ISO 8601 są „świadome” UTC. Przyjrzyjmy się teraz, co myśli JavaScript o łańcuchu daty i godziny. Pożyczając z tej odpowiedzi otrzymujemy:
Możesz również przeczytać ten wpis na blogu .
źródło
Łącząc wszystkie powyższe odpowiedzi otrzymałem następującą funkcję:
źródło
Używam wahadła:
źródło
Lub, aby zdobyć to za jednym zamachem:
źródło