Dodam ciągi czasu UTC do odpowiedzi API Bitbucket, które obecnie zawierają tylko ciągi czasu Amsterdam (!). Aby zachować spójność z ciągami czasowymi UTC zwracanymi w innym miejscu, pożądanym formatem jest 2011-11-03 11:07:04
(po którym następuje +00:00
, ale to nie jest istotne).
Jaki jest najlepszy sposób na utworzenie takiego ciągu ( bez składnika mikrosekundowego) z datetime
instancji ze składnikiem mikrosekundowym?
>>> import datetime
>>> print unicode(datetime.datetime.now())
2011-11-03 11:13:39.278026
Jako najlepszą odpowiedź dodam najlepszą możliwą opcję, ale może istnieć bardziej eleganckie rozwiązanie.
Edycja: Powinienem wspomnieć, że tak naprawdę nie drukuję aktualnego czasu - datetime.now
podałem szybki przykład. Dlatego rozwiązanie nie powinno zakładać, że wszelkie datetime
otrzymywane instancje będą zawierać elementy mikrosekundowe.
źródło
.isoformat()
, który domyślnie zawiera mikrosekundy. Jeśli tego potrzebujesz, wyrażaj się jasno. Wszyscy natychmiast zrozumieją, co robi ten kod. Prawie nikt nie zrozumie drugiego kodu bez przeglądania dokumentacji.źródło
.isoformat([sep])
- Zwraca ciąg znaków reprezentujący datę i godzinę w formacie ISO 8601, RRRR-MM-DDTHH: MM: SS.mmmmmm lub, jeśli mikrosekunda jest 0, RRRR-MM-DDTHH: MM: SS "W Python 3.6:
https://docs.python.org/3.6/library/datetime.html#datetime.datetime.isoformat
źródło
Tak to robię. Format ISO:
Możesz zastąpić „T”, jeśli nie chcesz formatu ISO:
źródło
.isoformat()
nadunicode()
?unicode()
, a jeśli chcesz ISO-8601, użyjisoformat()
unicode()
jest wygodniejszy niż na.isoformat().replace('T', ' ')
pewno. ;)isoformat
akceptuje specyfikator separatora, więc nie należy go zastępować. po prostu zrób:datetime.datetime.now().replace(microsecond=0).isoformat(' ')
Jeszcze inna opcja:
Domyślnie wykorzystuje to czas lokalny, jeśli potrzebujesz UTC, możesz użyć następujących opcji:
źródło
Zachowaj pierwszych 19 znaków, które chciałeś wyciąć:
źródło
+05:30
. Prawidłowe byłobystr(now())[:19]
.10000
sekunda zostanie pominiętaZwyklę robię:
wynik:
źródło
Ponieważ nie wszystkie
datetime.datetime
instancje mają składnik mikrosekundowy (tzn. Gdy jest równy zero), możesz podzielić ciąg na „.” i weź tylko pierwszy przedmiot, który zawsze zadziała:źródło
Możemy spróbować czegoś takiego jak poniżej
źródło
.isoformat(' ', 'seconds')
zaproponowane we wcześniejszej odpowiedzi.Uważam, że jest to najprostszy sposób.
źródło
Korzystam z tego, ponieważ mogę go lepiej zrozumieć i dlatego lepiej go zapamiętać (a format daty i godziny można również dostosować w zależności od wyboru): -
źródło