2010-08-03 4 views
39

Necesito producir una cadena de tiempo que coincida con el formato ISO yyyy-mm-ddThh:mm:ss.ssssss-ZO:NE. Los métodos de clase now() y utcnow() casi hacen lo que quiero.¿Cómo obtener una cadena isoformat datetime que incluya la zona horaria predeterminada?

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

Respuesta

-4

Algo como el siguiente ejemplo. Tenga en cuenta que estoy en el este de Australia (UTC + 10 horas en este momento).

>>> import datetime 
>>> dtnow = datetime.datetime.now();dtutcnow = datetime.datetime.utcnow() 
>>> dtnow 
datetime.datetime(2010, 8, 4, 9, 33, 9, 890000) 
>>> dtutcnow 
datetime.datetime(2010, 8, 3, 23, 33, 9, 890000) 
>>> delta = dtnow - dtutcnow 
>>> delta 
datetime.timedelta(0, 36000) 
>>> hh,mm = divmod((delta.days * 24*60*60 + delta.seconds + 30) // 60, 60) 
>>> hh,mm 
(10, 0) 
>>> "%s%+02d:%02d" % (dtnow.isoformat(), hh, mm) 
'2010-08-04T09:33:09.890000+10:00' 
>>> 
+1

Solución pequeña para el formateo: "% s% + 03d:% 02d"% (dtnow.isoformat(), hh, mm) –

+8

Usar la resta para determinar la diferencia entre tu propia zona horaria y cualquier otra está plagada de peligros. Mucho mejor son las soluciones donde proporciona la zona horaria. –

+2

Acepto: no use esta solución. No reinventar la rueda. – osa

31

Tiene que hacer que sus objetos de fecha y hora reconozcan la zona horaria. desde datetime docs:

Hay dos tipos de objetos de fecha y hora: "ingenuo" y "consciente". Esta distinción se refiere a si el objeto tiene alguna noción de zona horaria, horario de verano u otro tipo de ajuste de tiempo algorítmico o algorítmico. Si un objeto inoportuno a tiempo representa el Tiempo Universal Coordinado (UTC), la hora local o el horario en alguna otra zona horaria depende exclusivamente del programa, al igual que depende del programa si un número en particular representa metros, millas o masa. Los objetos naive datetime son fáciles de entender y de trabajar, a costa de ignorar algunos aspectos de la realidad.

Cuando tiene un objeto datetime al tanto, puede usar isoformat() y obtener el resultado que necesita.

Para continuar con su fecha y hora objetos conscientes, tendrá que subclass tzinfo, like the second example in here, o simple - utilizar un paquete que lo hace por usted, como pytz o python-dateutil

Usando pytz, este sería el resultado:

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

también puede controlar el formato de salida, si se utiliza con el strftime '%z' format directive como

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

No del todo correcto: la directiva% z format imprime el desplazamiento de zona horaria sin dos puntos, el formato ISO sin embargo separa horas y minutos en el especificador TZ con dos puntos. Sin embargo, llamar al método isoformat() en una fecha de tiempo con reconocimiento de zona horaria funcionará. – tjollans

+4

Un huso horario de zona horaria formateará correctamente con .isoformat(). –

+1

Para ampliar el comentario de @ DavidK.Hess, el 'strftime' en su segundo ejemplo es demasiado complicado. Los siguientes trabajos y (imo) es más limpio: 'datetime.now(). Replace (tzinfo = pytz.timezone (" US/Eastern ")). Isoformat()' – jedwards

46

Para obtener la hora actual en UTC en Python 3.2+:

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

para obtener la hora local en Python 3.3+:

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

Explicación: datetime.now(timezone.utc) produce un objeto conscientes datetime zona horaria en el tiempo UTC. astimezone() luego cambia la zona horaria del objeto datetime, a la zona horaria local del sistema si se llama sin argumentos. Los objetos de Timezone aware datetime producen el formato ISO correcto automáticamente.

+0

A partir de Python 3.6, el El método 'astimezone()' ahora se puede invocar en instancias ingenuas que se supone que representan la hora local del sistema. –

+0

@ABB incluso en Python 3.6, se deben usar objetos de fecha y hora que funcionen incluso si la hora local actual es ambigua (p. ej. una transición DST). – jfs

16

Con arrow:

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

Puede hacerlo en Python 2.7+ con python-dateutil (que se insalled en Mac por defecto):

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

O bien, si desea convertir de una cadena almacenada existente:

>>> 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) 
Cuestiones relacionadas