web-dev-qa-db-fra.com

Python UTC n'inclut pas Z (décalage zoulou ou nul)

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
75
Murali Mopuru

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.)

38
stiv

Option: 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

Option: 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 ()


Supplémentaire: fuseau horaire lisible par l'homme

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'
33
Manav Kataria

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.

6
U2EF1

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
4
Jam Risser

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'
2
Michel Samia

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'
1
Michael Cox

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)
1
EmptyData
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())
1
W Yg