Pourquoi python 2.7 n'inclut pas le caractère Z (zoulou ou décalage d'origine) à la fin de la chaîne isoformat de l'objet datetime UTC contrairement à JavaScript?
>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'
Attendu qu'en javascript
>>> console.log(new Date().toISOString());
2013-10-29T09:38:41.341Z
Les objets Python datetime
n'ont pas d'informations de fuseau horaire par défaut, et sans eux, 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 paquet pytz pour obtenir des fuseaux horaires par défaut, ou directement la sous-classe tzinfo
vous-même:
from datetime import datetime, tzinfo, timedelta
class simple_utc(tzinfo):
def tzname(self,**kwargs):
return "UTC"
def utcoffset(self, dt):
return timedelta(0)
Ensuite, vous pouvez ajouter manuellement les informations de fuseau horaire à utcnow()
:
>>> datetime.utcnow().replace(tzinfo=simple_utc()).isoformat()
'2014-05-16T22:51:53.015001+00:00'
Notez que cela est conforme au format ISO 8601, qui autorise soit Z
, soit +00:00
Comme suffixe pour UTC. Notez que ce dernier se conforme mieux à la norme, avec la façon dont les fuseaux horaires sont représentés en général (UTC est un cas particulier.)
isoformat()
datetime
de Python ne prend pas en charge les suffixes fuseau horaire militaire , comme le suffixe 'Z' pour UTC. Le remplacement de chaîne simple suivant fait l'affaire:
In [1]: import datetime
In [2]: d = datetime.datetime(2014, 12, 10, 12, 0, 0)
In [3]: str(d).replace('+00:00', 'Z')
Out[3]: '2014-12-10 12:00:00Z'
str(d)
est essentiellement identique à d.isoformat(sep=' ')
Voir: Datetime, Python Bibliothèque standard
strftime()
Ou vous pouvez utiliser strftime
pour obtenir le même effet:
In [4]: d.strftime('%Y-%m-%d %H:%M:%SZ')
Out[4]: '2014-12-10 12:00:00Z'
Remarque: cette option ne fonctionne que si vous savez que la date spécifiée est en UTC.
Voir: datetime.strftime ()
Pour aller plus loin, l’affichage d’informations de fuseau horaire lisibles par l’homme peut vous intéresser, pytz
avec strftime
%Z
In [5]: import pytz
In [6]: d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=pytz.utc)
In [7]: d
Out[7]: datetime.datetime(2014, 12, 10, 12, 0, tzinfo=<UTC>)
In [8]: d.strftime('%Y-%m-%d %H:%M:%S %Z')
Out[8]: '2014-12-10 12:00:00 UTC'
Les dates de Python sont un peu maladroites. Utilisez arrow
.
> str(arrow.utcnow())
'2014-05-17T01:18:47.944126+00:00'
Arrow a essentiellement la même api que datetime, mais avec des fuseaux horaires et des subtilités supplémentaires qui devraient figurer dans la bibliothèque principale.
Un format compatible avec Javascript peut être réalisé par:
arrow.utcnow().isoformat().replace("+00:00", "Z")
'2018-11-30T02:46:40.714281Z'
Javascript Date.parse
supprimera discrètement les microsecondes de l'horodatage.
Les scripts javascript et python suivants) donnent des résultats identiques. Je pense que c'est ce que vous recherchez.
JavaScript
new Date().toISOString()
Python
import datetime
datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
La sortie qu'ils donnent est l'heure utc (zelda), formatée sous la forme d'une chaîne ISO avec un chiffre significatif de 3 millisecondes et ajoutée d'un Z.
2019-01-19T23:20:25.459Z
Dans Python> = 3.2, vous pouvez simplement utiliser ceci:
>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).isoformat()
'2019-03-14T07:55:36.979511+00:00'
Il y a beaucoup de bonnes réponses sur le post, mais je voulais que le format sorte exactement comme il le fait avec JavaScript. C'est ce que j'utilise et cela fonctionne bien.
In [1]: import datetime
In [1]: now = datetime.datetime.utcnow()
In [1]: now.strftime('%Y-%m-%dT%H:%M:%S') + now.strftime('.%f')[:4] + 'Z'
Out[3]: '2018-10-16T13:18:34.856Z'
En combinant toutes les réponses ci-dessus, je suis venu avec la fonction suivante:
from datetime import datetime, tzinfo, timedelta
class simple_utc(tzinfo):
def tzname(self,**kwargs):
return "UTC"
def utcoffset(self, dt):
return timedelta(0)
def getdata(yy, mm, dd, h, m, s) :
d = datetime(yy, mm, dd, h, m, s)
d = d.replace(tzinfo=simple_utc()).isoformat()
d = str(d).replace('+00:00', 'Z')
return d
print getdata(2018, 02, 03, 15, 0, 14)
pip install python-dateutil
>>> a = "2019-06-27T02:14:49.443814497Z"
>>> dateutil.parser.parse(a)
datetime.datetime(2019, 6, 27, 2, 14, 49, 443814, tzinfo=tzutc())