Ich war verwirrt, als ich mich mit datetime im Hinblick auf die Zeitzone befasste, daher werde ich es für mich selbst zusammenfassen.
Naive,Aware
Datums- und Uhrzeitobjekte in Python werden in die folgenden zwei Typen eingeteilt. Der grobe Unterschied ist "mit oder ohne Zeitzoneninformationen".
Naives Objekt
Keine Zeitzoneninformationen
Bewusstes Objekt
Hat Zeitzoneninformationen (tzinfo-Attribut)
Das Attribut tzinfo kann auf eine Instanz einer Unterklasse von [tzinfo] festgelegt werden (https://docs.python.org/ja/3/library/datetime.html#datetime.tzinfo).
Da dateitme.timezone eine Unterklasse von tzinfo ist, können Sie Objekte dieser Klasse festlegen.
Wenn Sie beispielsweise ein Objekt als "datetime.timezone" (timedelta (Stunden = + 9), "JST") erstellen, ist dies ein Objekt, das die JST-Zeitzone darstellt.
Wenn Sie in einem Programm eine zeitzonenbezogene Verarbeitung durchführen möchten, müssen Sie daher das Aware-Objekt verwenden.
Es gibt vier Hauptobjekte unten.
Je nachdem, wie jedes Objekt erstellt wird, kann es naiv oder bewusst sein. Zum Beispiel
>>> print('Python %s on %s' % (sys.version, sys.platform))
Python 3.7.4 (default, Oct 10 2019, 12:40:25)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
>>> import datetime
>>> aware_dt = datetime.datetime.now(tz=datetime.timezone.utc)
>>> aware_dt
datetime.datetime(2020, 4, 4, 5, 49, 51, 291393, tzinfo=datetime.timezone.utc)
>>> naive_dt = datetime.datetime.utcnow()
>>> naive_dt
datetime.datetime(2020, 4, 4, 5, 50, 8, 499521)
>>> aware_dt.tzinfo
datetime.timezone.utc
>>> print(naive_dt.tzinfo)
<class 'NoneType'>
Beim Erstellen der aktuellen utc-Zeit als Objekt gibt es eine Methode zum Festlegen der Zeitzone und eine Methode zum Nichtgeben.
strptime
Eine Methode, die eine Zeichenfolge, die ein Datum darstellt, zu einem Datums- / Uhrzeittyp macht.
>>> str_dt = '2020-3-01 10:11:12'
>>> strp_dt = datetime.datetime.strptime(str_dt, "%Y-%m-%d %H:%M:%S")
>>> strp_dt
datetime.datetime(2020, 3, 1, 10, 11, 12)
>>> print(type(strp_dt.tzinfo))
<class 'NoneType'>
Das erstellte Objekt enthält keine Zeitzonenattribute. Wenn die Zeichenfolge vor der Konvertierung jedoch eine Zeitzone enthält und das Format entsprechend eingestellt ist
>>> str_dt_utc = '2020-3-01 10:11:12+00:00'
>>> strp_dt_utc = datetime.datetime.strptime(str_dt_utc, "%Y-%m-%d %H:%M:%S%z")
>>> strp_dt_utc
datetime.datetime(2020, 3, 1, 10, 11, 12, tzinfo=datetime.timezone.utc)
>>> str_dt_jst = '2020-3-01 10:11:12+09:00'
>>> strp_dt_jst = datetime.datetime.strptime(str_dt_jst, "%Y-%m-%d %H:%M:%S%z")
>>> strp_dt_jst
datetime.datetime(2020, 3, 1, 10, 11, 12, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400)))
Es scheint, dass ein Datum / Uhrzeit-Objekt mit dem Zeitzonenattribut wie in erstellt wird.
astimezone
Eine Methode, die ein Datum / Uhrzeit-Objekt gemäß den angegebenen Zeitzoneninformationen konvertiert.
>>> strp_dt.astimezone(datetime.timezone.utc)
datetime.datetime(2020, 3, 1, 1, 11, 12, tzinfo=datetime.timezone.utc)
Der Zeitunterschied zwischen JST und UTC, -9 Stunden, wurde wiedergegeben, und das Datum / Uhrzeit-Objekt mit hinzugefügtem tzinfo wurde zurückgegeben. (Ist dies ein Vergleich mit der lokalen Zeitzone?)
replace
Eine Methode, die die Zeitzone eines Datetime-Objekts in die angegebene Zeitzone konvertiert.
>>> strp_dt.replace(tzinfo=datetime.timezone.utc)
datetime.datetime(2020, 3, 1, 10, 11, 12, tzinfo=datetime.timezone.utc)
Beachten Sie, dass im Vergleich zu Astimezone nur Tzinfo umgewandelt wird.
In Bezug auf die Erstellung des Zeitzonenobjekts können Sie es einfach wie "datetime.timezone (timedelta (Stunden = + 9)," JST ")" erstellen oder ein Modul eines Drittanbieters (pytz, dateutil) verwenden. Es gibt verschiedene Methoden.
Recommended Posts