464 votes

L'heure ISO (ISO 8601) en Python

J'ai un dossier. En Python, j'aimerais prendre son heure de création et la convertir en une valeur de Chaîne de temps ISO (ISO 8601) tout en préservant le fait qu'il a été créé dans la Fuseau horaire de l'Est (ET) .

Comment puis-je prendre le ctime du fichier et le convertir en une chaîne de temps ISO qui indique le fuseau horaire de l'Est (et tient compte de l'heure d'été, si nécessaire) ?

1 votes

12 votes

@Nick- Lien utile, mais pas un duplicata - il demande la conversion dans l'autre sens.

1 votes

@Joseph- Je viens de poser cette question en ce qui concerne le RFC 3999- cela devrait fonctionner pour ceci - Générer un timestamp RFC 3339 en Python

60voto

Voislav Sauca Points 757

ISO 8601 Représentation du temps

La norme internationale ISO 8601 décrit une représentation sous forme de chaîne pour les dates et les heures. Deux exemples simples de ce format sont

2010-12-16 17:22:15
20101216T172215

(qui signifient tous deux le 16 décembre 2010), mais le format permet également d'obtenir des temps de résolution inférieurs à la seconde et de préciser les fuseaux horaires. Ce format n'est bien sûr pas spécifique à Python, mais il permet de stocker les dates et les heures dans un format portable. Des détails sur ce format peuvent être trouvés dans la page Entrée Markus Kuhn .

Je recommande l'utilisation de ce format pour stocker les heures dans les fichiers.

Une façon d'obtenir l'heure actuelle dans cette représentation est d'utiliser strftime du module time de la bibliothèque standard de Python :

>>> from time import strftime
>>> strftime("%Y-%m-%d %H:%M:%S")
'2010-03-03 21:16:45'

Vous pouvez utiliser le constructeur strptime de la classe datetime :

>>> from datetime import datetime
>>> datetime.strptime("2010-06-04 21:08:12", "%Y-%m-%d %H:%M:%S")
datetime.datetime(2010, 6, 4, 21, 8, 12)

Le plus robuste est le module mxDateTime d'Egenix :

>>> from mx.DateTime.ISO import ParseDateTimeUTC
>>> from datetime import datetime
>>> x = ParseDateTimeUTC("2010-06-04 21:08:12")
>>> datetime.fromtimestamp(x)
datetime.datetime(2010, 3, 6, 21, 8, 12)

Références

2 votes

Dans quel sens est-il "plus robuste" ?

0 votes

Date : 2018-05-25

0 votes

Date et heure combinées en UTC : 2018-05-25T12:16:14+00:00

50voto

user2120810 Points 181

J'ai trouvé le datetime.isoformat dans la documentation . Il semble faire ce que vous voulez :

datetime.isoformat([sep])

Return a string representing the date and time in ISO 8601 format, YYYY-MM-DDTHH:MM:SS.mmmmmm or, if microsecond is 0, YYYY-MM-DDTHH:MM:SS

If utcoffset() does not return None, a 6-character string is appended, giving the UTC offset in (signed) hours and minutes: YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM or, if microsecond is 0 YYYY-MM-DDTHH:MM:SS+HH:MM

The optional argument sep (default 'T') is a one-character separator, placed between the date and time portions of the result. For example,
>>>

>>> from datetime import tzinfo, timedelta, datetime
>>> class TZ(tzinfo):
...     def utcoffset(self, dt): return timedelta(minutes=-399)
...
>>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')
'2002-12-25 00:00:00-06:39'

17voto

Max Shawabkeh Points 19030

Vous devrez utiliser os.stat pour obtenir le temps de création du fichier et une combinaison de time.strftime y time.timezone pour le formatage :

>>> import time
>>> import os
>>> t = os.stat('C:/Path/To/File.txt').st_ctime
>>> t = time.localtime(t)
>>> formatted = time.strftime('%Y-%m-%d %H:%M:%S', t)
>>> tz = str.format('{0:+06.2f}', float(time.timezone) / 3600)
>>> final = formatted + tz
>>> 
>>> final
'2008-11-24 14:46:08-02.00'

0 votes

Le fuseau horaire tient-il compte de l'heure d'été ? Il semble que le tz sera le même, qu'il y ait ou non passage à l'heure d'été.

2 votes

Il s'agira de la compensation actuellement en vigueur. Si l'heure d'été est active, le décalage sera différent de celui qui l'est en dehors.

4voto

Jarek Przygódzki Points 1215

Corrigez-moi si je me trompe (ce n'est pas le cas), mais le décalage par rapport à l'UTC change avec l'heure d'été. Vous devriez donc utiliser

tz = str.format('{0:+06.2f}', float(time.altzone) / 3600)

Je pense également que le signe devrait être différent :

tz = str.format('{0:+06.2f}', -float(time.altzone) / 3600)

Je peux me tromper, mais je ne pense pas.

2voto

mattbornski Points 2226

Je suis d'accord avec Jarek, et je note en outre que le caractère séparateur de l'offset ISO est un deux-points, donc je pense que la réponse finale devrait être :

isodate.datetime_isoformat(datetime.datetime.now()) + str.format('{0:+06.2f}', -float(time.timezone) / 3600).replace('.', ':')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X