Pourquoi python 2.7 n'inclut pas le caractère Z (Zulu ou décalage zéro) à la fin de la chaîne d'isoformat de l'objet datetime UTC contrairement à JavaScript?
>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'
Alors qu'en javascript
>>> console.log(new Date().toISOString());
2013-10-29T09:38:41.341Z
datetime.datetime.utcnow().isoformat() + 'Z'
Réponses:
Les
datetime
objets Python n'ont pas d'informations de fuseau horaire par défaut, et sans cela, Python viole en fait la spécification ISO 8601 ( si aucune information de fuseau horaire n'est donnée, supposée être l'heure locale ). Vous pouvez utiliser le package pytz pour obtenir des fuseaux horaires par défaut, outzinfo
vous sous - classer directement :Ensuite, vous pouvez ajouter manuellement les informations de fuseau horaire à
utcnow()
:Notez que cela est conforme au format ISO 8601, qui autorise l'un
Z
ou l' autre ou+00:00
comme suffixe pour UTC. Notez que ce dernier est en fait mieux conforme à la norme, avec la façon dont les fuseaux horaires sont représentés en général (UTC est un cas particulier.)la source
Z
au lieu de+00:00
?pytz
viole letzinfo
protocole de Python et est dangereux à utiliser! Voir blog.ganssle.io/articles/2018/03/pytz-fastest-footgun.htmldateutil
de fonctionner n'ont pas été implémentés avant Python 3.6 avec PEP 495, doncpytz
ne pas utiliser l'interface standard est injuste car l'interface a changé. Avant le changement, la seule façon de le faire fonctionner était de lepytz
faire.Option:
isoformat()
Python
datetime
ne prend pas en charge les suffixes de fuseau horaire militaire comme le suffixe «Z» pour UTC. Le remplacement de chaîne simple suivant fait l'affaire:str(d)
est essentiellement le même qued.isoformat(sep=' ')
Voir: Datetime, bibliothèque standard Python
Option:
strftime()
Ou vous pouvez utiliser
strftime
pour obtenir le même effet:Remarque: cette option ne fonctionne que lorsque vous savez que la date spécifiée est en UTC.
Voir: datetime.strftime ()
Supplémentaire: fuseau horaire lisible par l'homme
Pour aller plus loin, vous voudrez peut-être afficher des informations de fuseau horaire lisibles par l'homme,
pytz
avec unstrftime
%Z
indicateur de fuseau horaire:la source
T
au lieu d'un blanc?d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=datetime.timezone.utc)
à la ligne 2. Btw., dans RFC3339, il est dit qu'un espace est «ok» (au lieu du «T»).Les scripts javascript et python suivants donnent des sorties identiques. Je pense que c'est ce que vous recherchez.
JavaScript
Python
La sortie qu'ils donnent est l'heure utc (zelda) formatée comme une chaîne ISO avec un chiffre significatif de 3 millisecondes et ajoutée avec un Z.
la source
En Python> = 3.2, vous pouvez simplement utiliser ceci:
la source
Z
, vous pouvez.isoformat()[:-6] + 'Z'
Les datetimes Python sont un peu maladroits. Utilisez
arrow
.Arrow a essentiellement la même API que datetime, mais avec des fuseaux horaires et des subtilités supplémentaires qui devraient être dans la bibliothèque principale.
Un format compatible avec Javascript peut être obtenu par:
Javascript
Date.parse
supprimera discrètement les microsecondes de l'horodatage.la source
Il y a beaucoup de bonnes réponses sur le post, mais je voulais que le format soit exactement comme il le fait avec JavaScript. C'est ce que j'utilise et cela fonctionne bien.
la source
la source
J'ai abordé ce problème avec quelques objectifs:
timezone
fonction utilitaire Django et l'dateutil
analyseurCette approche n'inclut pas de suffixe Z et ne l' utilise pas
utcnow()
, mais elle est basée sur la recommandation de la documentation Python et passe par Django et JavaScript.Commençons par passer un objet fuseau horaire UTC au
datetime.now()
lieu d'utiliserdatetime.utcnow()
:Cela semble bon, alors voyons ce que Django et
dateutil
pensons:D'accord, l'objet datetime Python et la chaîne ISO 8601 sont compatibles UTC. Voyons maintenant ce que JavaScript pense de la chaîne datetime. En empruntant à cette réponse, nous obtenons:
Vous pouvez également lire ce billet de blog .
la source
En combinant toutes les réponses ci-dessus, je suis venu avec la fonction suivante:
la source
J'utilise le pendule:
la source
Ou, pour l'obtenir d'un seul coup:
la source