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