J'étais confus quand je traitais de la date / heure avec le fuseau horaire à l'esprit, donc je vais le résumer pour moi-même.
Naive,Aware
Les objets de date et d'heure en Python sont classés dans les deux types suivants. La différence approximative est «avec ou sans informations de fuseau horaire».
Objet naïf
Aucune information sur le fuseau horaire
Objet conscient
A des informations de fuseau horaire (attribut tzinfo)
L'attribut tzinfo peut être défini sur une instance d'une sous-classe de tzinfo.
Puisque dateitme.timezone est une sous-classe de tzinfo, vous pouvez définir des objets de cette classe.
Par exemple, si vous créez un objet comme datetime.timezone (timedelta (heures = + 9), 'JST')
, c'est un objet qui représente le fuseau horaire JST.
Par conséquent, si vous souhaitez effectuer un traitement tenant compte du fuseau horaire dans certains programmes, vous devez utiliser l'objet Aware.
Il y a quatre objets principaux ci-dessous.
Selon la façon dont chaque objet est créé, il peut être naïf ou conscient. Par exemple
>>> 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'>
Lors de la création de l'heure actuelle utc en tant qu'objet, il existe une méthode de spécification du fuseau horaire et une méthode de non.
strptime
Méthode qui transforme une chaîne de caractères représentant une date de type datetime.
>>> 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'>
L'objet créé ne contient pas d'attributs de fuseau horaire. Cependant, si la chaîne de caractères avant la conversion contient un fuseau horaire et que le format est défini de manière appropriée
>>> 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)))
Il semble qu'un objet datetime est créé avec l'attribut de fuseau horaire défini comme dans.
astimezone
Méthode qui convertit un objet datetime en fonction des informations de fuseau horaire spécifiées.
>>> strp_dt.astimezone(datetime.timezone.utc)
datetime.datetime(2020, 3, 1, 1, 11, 12, tzinfo=datetime.timezone.utc)
La différence d'heure entre JST et UTC, -9 heures, a été reflétée et l'objet datetime avec tzinfo ajouté a été renvoyé. (S'agit-il d'une comparaison avec le fuseau horaire local?)
replace
Méthode qui convertit le fuseau horaire d'un objet datetime en fuseau horaire spécifié.
>>> strp_dt.replace(tzinfo=datetime.timezone.utc)
datetime.datetime(2020, 3, 1, 10, 11, 12, tzinfo=datetime.timezone.utc)
Notez que seul tzinfo est converti par rapport à astimezone.
Concernant la création de l'objet fuseau horaire, vous pouvez simplement le créer comme datetime.timezone (timedelta (heures = + 9), 'JST')
, ou utiliser un module tiers (pytz, dateutil). Il existe différentes méthodes.
Recommended Posts