web-dev-qa-db-fra.com

Comment obtenir une chaîne datetime isoformat incluant le fuseau horaire par défaut?

J'ai besoin de produire une chaîne de temps qui correspond au format iso yyyy-mm-ddThh:mm:ss.ssssss-ZO:NE. Les méthodes de classe now() et utcnow() font presque ce que je veux.

>>> import datetime
>>> #time adjusted for current timezone
>>> datetime.datetime.now().isoformat()
'2010-08-03T03:00:00.000000'
>>> #unadjusted UTC time
>>> datetime.datetime.utcnow().isoformat()
'2010-08-03T10:00:00.000000'
>>>
>>> #How can I do this?
>>> datetime.datetime.magic()
'2010-08-03T10:00:00.000000-07:00'
49
deft_code

Pour obtenir l'heure actuelle en UTC en Python 3.2+:

>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).isoformat()
'2015-01-27T05:57:31.399861+00:00'

Pour obtenir l'heure locale en Python 3.3+:

>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).astimezone().isoformat()
'2015-01-27T06:59:17.125448+01:00'

Explication: datetime.now(timezone.utc) produit un objet datetime sensible au fuseau horaire en temps UTC. astimezone() modifie ensuite le fuseau horaire de l'objet datetime, en fuseau horaire local du système s'il est appelé sans arguments. Les objets datetime sensibles au fuseau horaire produisent alors automatiquement le format ISO correct.

75
jfs

Vous devez prendre en compte le fuseau horaire de vos objets datetime. à partir des datetime docs :

Il existe deux types d'objets de date et d'heure: "naïf" et "conscient". Cette distinction fait référence à la question de savoir si l'objet a une notion de fuseau horaire, d'heure d'été ou d'un autre type d'ajustement algorithmique ou politique de l'heure. Le fait qu'un objet datetime naïf représente le temps universel coordonné (UTC), l'heure locale ou l'heure dans un autre fuseau horaire dépend entièrement du programme, tout comme il appartient au programme de savoir si un nombre particulier représente des mètres, des miles ou une masse. Les objets naïfs datetime sont faciles à comprendre et à utiliser, au prix d'ignorer certains aspects de la réalité.

Lorsque vous avez un objet datetime conscient, vous pouvez utiliser isoformat () et obtenir la sortie dont vous avez besoin.

Pour rendre vos objets datetime conscients, vous devrez sous-classe tzinfo, comme le deuxième exemple ici , ou plus simple - utilisez un package qui le fait pour vous, comme pytz ou python-dateutil

En utilisant pytz, cela ressemblerait à:

import datetime, pytz
datetime.datetime.now(pytz.timezone('US/Central')).isoformat()

Vous pouvez également contrôler le format de sortie, si vous utilisez strftime avec la directive de format '% z' comme

datetime.datetime.now(pytz.timezone('US/Central')).strftime('%Y-%m-%dT%H:%M:%S.%f%z')
34
Ofri Raviv

Avec flèche :

>>> import arrow
>>> arrow.now().isoformat()
'2015-04-17T06:36:49.463207-05:00'
>>> arrow.utcnow().isoformat()
'2015-04-17T11:37:17.042330+00:00'
17
Wes Turner

Vous pouvez le faire dans Python 2.7+ avec python-dateutil (Qui est installé sur Mac par défaut):

>>> from datetime import datetime
>>> from dateutil.tz import tzlocal
>>> datetime.now(tzlocal()).isoformat()
'2016-10-22T12:45:45.353489-03:00'

Ou vous si vous souhaitez convertir à partir d'une chaîne stockée existante:

>>> from datetime import datetime
>>> from dateutil.tz import tzlocal
>>> from dateutil.parser import parse
>>> parse("2016-10-21T16:33:27.696173").replace(tzinfo=tzlocal()).isoformat()
'2016-10-21T16:33:27.696173-03:00' <-- Atlantic Daylight Time (ADT) 
>>> parse("2016-01-21T16:33:27.696173").replace(tzinfo=tzlocal()).isoformat()
'2016-01-21T16:33:27.696173-04:00' <-- Atlantic Standard Time (AST)
3
Dmitry Shesterkin