J'ai un dossier. En Python, je voudrais prendre son temps de création et le convertir en une chaîne de temps ISO (ISO 8601) tout en préservant le fait qu'il a été créé dans le fuseau horaire de l' Est (ET) .
Comment puis-je prendre le ctime du fichier et le convertir en une chaîne d'heure ISO qui indique le fuseau horaire de l'Est (et prend en compte l'heure d'été, si nécessaire)?
Réponses:
Local selon ISO 8601:
UTC à ISO 8601:
Local selon ISO 8601 sans microseconde:
UTC à ISO 8601 avec informations TimeZone (Python 3):
UTC à ISO 8601 avec informations de fuseau horaire local sans microseconde (Python 3):
Local à ISO 8601 avec informations TimeZone (Python 3):
Notez qu'il y a un bogue lors de l'utilisation
astimezone()
sur l'heure utc. Cela donne un résultat incorrect:Pour Python 2, consultez et utilisez pytz .
la source
.isoformat()
peut prendre un paramètre séparateur, (au cas où vous voudriez autre chose que 'T'):.isoformat(' ')
It is permitted to omit the 'T' character by mutual agreement.
Voici ce que j'utilise pour convertir au format datetime XSD:
Je suis tombé sur cette question lors de la recherche du format date / heure XSD (
xs:dateTime
). J'avais besoin de retirer les microsecondes deisoformat
.la source
xs:date
partir des feuilles de style XSD / XML.xs:dateTime
Représentation temporelle ISO 8601
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
(qui représentent tous deux le 16 décembre 2010), mais le format permet également des temps de résolution inférieurs à la seconde et de spécifier des fuseaux horaires. Ce format n'est bien sûr pas spécifique à Python, mais il est bon pour stocker des dates et des heures dans un format portable. Des détails sur ce format peuvent être trouvés dans l' entrée Markus Kuhn .
Je recommande l'utilisation de ce format pour stocker les heures dans des fichiers.
Une façon d'obtenir l'heure actuelle dans cette représentation est d'utiliser strftime depuis le module time de la bibliothèque standard Python:
Vous pouvez utiliser le constructeur strptime de la classe datetime:
Le plus robuste est le module Egenix mxDateTime:
Références
La documentation du module de temps Python
La documentation de la classe datetime Python
La classe Egenix mxDateTime
la source
2018-05-25
2018-05-25T12:16:14+00:00
2018-05-25T12:16:14Z
20180525T121614Z
J'ai trouvé le datetime.isoformat dans la documentation . Il semble faire ce que vous voulez:
la source
ISO 8601 permet une représentation compacte sans séparateurs sauf pour le
T
, donc j'aime utiliser cette ligne unique pour obtenir une chaîne d'horodatage rapide:Si vous n'avez pas besoin des microsecondes, laissez simplement la
.%f
partie:Pour l'heure locale:
Éditer:
Après avoir lu un peu plus à ce sujet, je vous recommande de laisser la ponctuation dans. La RFC 3339 recommande ce style parce que si tout le monde utilise la ponctuation, il n'y a pas de risque de choses comme plusieurs chaînes ISO 8601 triées en groupes sur leur ponctuation. Ainsi, la doublure pour une chaîne conforme serait:
la source
2019-02-23T04:02:04.051Z
avecnew Date().toISOString()
Le format d'heure ISO 8601 ne stocke pas de nom de fuseau horaire, seul le décalage UTC correspondant est conservé.
Pour convertir un fichier ctime en une chaîne horaire ISO 8601 tout en préservant le décalage UTC dans Python 3:
Le code suppose que votre fuseau horaire local est le fuseau horaire de l' Est (ET) et que votre système fournit un décalage UTC correct pour l'horodatage POSIX donné (
ts
), c'est-à-dire que Python a accès à une base de données de fuseau horaire historique sur votre système ou le fuseau horaire avait le mêmes règles à une date donnée.Si vous avez besoin d'une solution portable; utilisez le
pytz
module qui donne accès à la base de données tz :Le résultat est le même dans ce cas.
Si vous avez besoin du nom / abréviation / id du fuseau horaire, enregistrez-le séparément.
Remarque: non,
:
dans le décalage UTC et l'EST
abréviation de fuseau horaire ne fait pas partie du format d'heure ISO 8601. Ce n'est pas unique.Différentes bibliothèques / différentes versions de la même bibliothèque peuvent utiliser des règles de fuseau horaire différentes pour la même date / fuseau horaire. S'il s'agit d'une date future, les règles sont peut-être encore inconnues. En d' autres termes, en même temps UTC peut correspondre à une autre heure locale en fonction de ce que règles que vous utilisez - l' enregistrement d' une heure au format ISO 8601 conserve l' heure UTC et l'heure locale qui correspond aux actuelles règles de fuseau horaire en cours d' utilisation sur votre plate - forme . Vous devrez peut-être recalculer l'heure locale sur une autre plate-forme si elle a des règles différentes.
la source
Vous devrez utiliser
os.stat
pour obtenir l'heure de création du fichier et une combinaison detime.strftime
ettime.timezone
pour le formatage:la source
Corrigez-moi si je me trompe (je ne me trompe pas), mais le décalage par rapport à l'UTC change avec l'heure d'été. Vous devez donc utiliser
Je pense également que le signe devrait être différent:
Je peux me tromper, mais je ne pense pas.
la source
Je suis d'accord avec Jarek, et je note en outre que le caractère séparateur de décalage ISO est un deux-points, donc je pense que la réponse finale devrait être:
la source
Ajout d'une petite variation à l' excellente réponse d' Estani
Local selon ISO 8601 avec TimeZone et sans info microseconde (Python 3):
Exemple de sortie:
Testé que cette sortie peut être analysée à la fois par Javascript
Date
et C #DateTime
/DateTimeOffset
la source
J'ai développé cette fonction:
la source
la source