Je pense personnellement que le module datetime est l'une des bibliothèques Python standard qui n'est pas très cool car il a de nombreux pièges et est difficile à utiliser malgré son utilisation fréquente.
C'est un tel module datetime, mais je suis un peu impressionné par le fait que j'ai pu beaucoup organiser le code lorsque j'ai migré mon projet Python 2 vers Python 3.
La conversion de l'heure unix en datetime.datetime
se fait avec la fonction .fromtimestamp ()
pour l'heure locale et la fonction.utcfromtimestamp ()
pour l'UTC.
>>> import time
>>> from datetime import datetime
>>> now = time.time()
>>> now
1415542873.099776
>>> loc = datetime.fromtimestamp(now)
>>> loc
datetime.datetime(2014, 11, 9, 23, 21, 13, 99776)
>>> utc = datetime.utcfromtimestamp(now)
>>> utc
datetime.datetime(2014, 11, 9, 14, 21, 13, 99776)
Cependant, au contraire, la conversion de datetime
en unixtime ne peut pas se faire directement, et il est nécessaire de la convertir une fois en type time.struct_time
avec la méthode.timetuple ()
.
De plus, lorsque vous revenez à unixtime à partir de là, vous pouvez utiliser time.mktime ()
pour l'heure locale, mais vous avez besoin de calendar.timegm ()
pour UTC. C'est un peu décevant d'importer le module de calendrier juste pour cela.
>>> time.mktime(loc.timetuple())
1415542873.0
>>> import calendar
>>> calendar.timegm(utc.timetuple())
1415542873
Le module time fournit uniquement une minuterie supplémentaire par système d'exploitation pour la fonctionnalité du langage C time.h
, et datetime est conçu pour Python à l'envers, donc lorsque vous essayez de l'utiliser en combinaison, une telle incompatibilité se produit. Était là.
Cependant, Python 3.3 ajoute une méthode .timestamp ()
qui crée unixtime directement sur l'objet datetime.
>>> from datetime import datetime
>>> now = 1415542873.099776
>>> loc = datetime.fromtimestamp(now)
>>> loc.timestamp()
1415542873.099776
Cependant, .timestamp ()
utilise tzinfo que datetime lui-même a, et si datetime (appelé naïf) qui n'a pas tzinfo, il sera calculé comme heure locale.
Si vous souhaitez convertir une date UTC en heure unix, vous devez définir correctement tz = utc. Consultez la section suivante pour cela.
timezone
Le type datetime du module datetime qui a des informations de fuseau horaire est appelé conscient, et celui qui n'a pas d'informations de fuseau horaire est appelé naïf.
Le datetime naïf est attrayant en tant que type pur qui ne devient pas accro à la conversion de fuseau horaire bruyant lors de l'interaction avec d'autres logiciels naïfs tels que MySQL, mais lors de l'écriture de programmes qui gèrent à la fois UTC et JST. Si vous faites une erreur et exécutez +9 deux fois, cela provoquera un bogue.
L'IANA publie une base de données des fuseaux horaires mondiaux, mais comme le minutage n'est pas synchronisé avec la mise à niveau de la version Python, la bibliothèque standard ne fournit que des classes abstraites et les classes de fuseaux horaires qui en héritent. A été fourni dans une bibliothèque non standard appelée pytz.
Cependant, JST et UTC, qui n'ont pas d'heure d'été jusqu'à présent, sont des applications suffisantes, et il est un peu gênant d'utiliser des bases de données de fuseaux horaires partout dans le monde. Je sens que je peux comprendre les sentiments des personnes ASCII qui ne veulent pas penser à l'environnement multi-octets.
Dans Python 3, une classe appelée datetime.timezone
qui gère les fuseaux horaires avec une différence de temps fixe par rapport à UTC et aucune heure d'été est fournie dans la bibliothèque standard, et pour UTC, datetime.timezone.utc
est fourni depuis le début. Il est fourni.
Utilisons ceci pour convertir le unixtime et le datetime que nous avons fait dans la section précédente, cette fois avec un datetime conscient.
>>> from datetime import datetime, timezone, timedelta
>>> now = 1415542873.099776
>>> JST = timezone(timedelta(hours=+9), 'JST')
>>> loc = datetime.fromtimestamp(now, JST)
>>> utc = datetime.fromtimestamp(now, timezone.utc)
>>> print(loc)
2014-11-09 23:21:13.099776+09:00
>>> print(utc)
2014-11-09 14:21:13.099776+00:00
>>> loc.timestamp()
1415542873.099776
>>> utc.timestamp()
1415542873.099776
Vous n'avez même pas besoin d'un module de calendrier et vous pouvez désormais écrire du code plus simple et moins bogué que dans Python 2.
Pour ajouter des informations de fuseau horaire à datetime naïf, utilisez la méthode .replace ()
.
>>> naiveutc = datetime.utcfromtimestamp(now)
>>> naiveutc
datetime.datetime(2014, 11, 9, 14, 21, 13, 99776)
>>> naiveutc.replace(tzinfo=timezone.utc).timestamp()
1415542873.099776
Recommended Posts