Quoi de neuf dans datetime qui est un peu plus utile dans Python 3

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.

Conversion mutuelle avec unixtime

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

Quoi de neuf dans datetime qui est un peu plus utile dans Python 3
Quoi de neuf dans Python 3.5
Quoi de neuf dans Python 3.6
Nouveautés de Python 3.10 (Résumé)
Que contient cette variable (lorsque le script Python est en cours d'exécution)
Nouveau dans Python 3.4.0 (2) --enum
Nouveautés de Python 3.9 (Résumé)
Nouveau dans les dictionnaires de fusion python3.9
Jouez des sons en Python en supposant que le clavier est un clavier de piano
Un programme qui détermine si un nombre entré en Python est un nombre premier
Hash en Perl est un dictionnaire en Python
Un mémo que j'ai écrit un tri rapide en Python
Un programme qui supprime les instructions en double en Python
Créer une nouvelle page en confluence avec Python
Créer un objet datetime à partir d'une chaîne en Python (Python 3.3)
Vérifiez si la chaîne est un nombre en python
Hello World avec un serveur Web simple qui suit WSGI (Web Server Gateway Interface) en Python
Trouvez la partie 575 de Wikipedia en Python
En Python, créez un décorateur qui accepte dynamiquement les arguments Créer un décorateur
Nouveau dans Python 3.4.0 (1) --pathlib
MALSS (introduction), un outil qui prend en charge l'apprentissage automatique en Python
Comment tester cette exception est déclenchée dans python unittest
Programme Python du "Livre qui enseigne facilement la programmation difficile"
Un programme polyvalent qui formate les chaînes de commande Linux avec python
Une fonction qui divise l'itérable en N morceaux en Python
Publication d'une bibliothèque qui masque les données de caractères dans les images Python
Boucle sur un générateur qui renvoie un itérateur de date en Python
Créons un script qui s'enregistre avec Ideone.com en Python.
J'ai essayé "un programme qui supprime les déclarations en double en Python"
L'image en échelle de gris est affichée sous forme d'image couleur dans OpenCV / Python
Créez le code qui renvoie "A et prétendant B" en python
[MQTT / Python] Implémentation d'une classe qui fait Pub / Sub de MQTT en Python
Y a-t-il un biais dans les nombres qui apparaissent dans les nombres de Fibonacci?
Un ensemble de fichiers de script qui font wordcloud avec Python3
Prendre une capture d'écran en Python
[Python] Débogage plus efficace!
Créer une fonction en Python
Créer un dictionnaire en Python
Créer un bookmarklet en Python
Dessinez un cœur en Python
Voici un résumé des choses qui pourraient être utiles pour traiter des nombres complexes en Python
Un mémo qui gère les guillemets doubles pleine largeur avec les expressions régulières Python
Utilisez networkx, une bibliothèque qui gère les graphiques en python (Partie 2: Tutoriel)
Facile! Implémenter un bot Twitter qui s'exécute sur Heroku en Python
Un enregistrement que GAMEBOY n'a pas pu être fait avec Python. (PYBOY)
[Python] Temps d'exécution lorsqu'une fonction est saisie dans une valeur de dictionnaire
À propos de psd-tools, une bibliothèque capable de traiter des fichiers psd en Python
Supprimer un caractère spécifique en Python s'il s'agit du dernier
Comment déterminer qu'une clé croisée a été entrée dans Python3
Spécification du fuseau horaire lors de la conversion d'une chaîne de caractères en type datetime avec python
Une fonction qui mesure le temps de traitement d'une méthode en python
Une classe qui résume les méthodes fréquemment utilisées dans l'api twitter (python)
Implémentez votre propre commande magique jupyter% timeit, pratique pour la mesure de vitesse, en Python
[Python] Qu'est-ce qu'une fonction zip?
Probablement dans un serpent Nishiki (Titre original: Peut-être en Python)
[Python] Qu'est-ce qu'une instruction with?
Ecrire une dichotomie en Python
[python] Gérer les fonctions dans une liste
Appuyez sur une commande en Python (Windows)