2009-07-10 21 views
14

Digamos que tengo una variable t que se establece en esto:¿Cómo imprimo un horario de Python en la zona horaria local?

datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=<UTC>) 

Si digo str(t), me sale:

'2009-07-10 18:44:59.193982+00:00' 

¿Cómo puedo obtener una cadena similar, excepto impreso en la zona horaria local en lugar de UTC?

+0

local para qué? –

+0

relacionado: [¿Cómo convertir una fecha y hora de python utc a una hora local utilizando solo la biblioteca estándar de Python?] (Http://stackoverflow.com/a/13287083/4279) – jfs

Respuesta

17

piensa que su debe mirar a su alrededor: datetime.astimezone()

http://docs.python.org/library/datetime.html#datetime.datetime.astimezone

Véase también el módulo pytz - es bastante fácil de usar - como ejemplo:

eastern = timezone('US/Eastern') 

http://pytz.sourceforge.net/

Ejemplo:

from datetime import datetime 
import pytz 
from tzlocal import get_localzone # $ pip install tzlocal 

utc_dt = datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=pytz.utc) 
print(utc_dt.astimezone(get_localzone())) # print local time 
# -> 2009-07-10 14:44:59.193982-04:00 
+12

Entonces, ¿cómo obtengo la zona horaria local actual? – mike

+0

no es datetime.datetime (2009, 7, 10, 18, 44, 59, 193982) - ¿qué necesita? –

+10

Esta respuesta es incorrecta. Vivo en Inglaterra y EE. UU./oriental NO es la zona horaria ** local **. – Philluminati

0

escribí algo como esto el otro día:

import time, datetime 
def nowString(): 
    # we want something like '2007-10-18 14:00+0100' 
    mytz="%+4.4d" % (time.timezone/-(60*60) * 100) # time.timezone counts westwards! 
    dt = datetime.datetime.now() 
    dts = dt.strftime('%Y-%m-%d %H:%M') # %Z (timezone) would be empty 
    nowstring="%s%s" % (dts,mytz) 
    return nowstring 

Así que la parte interesante para usted es probablemente la línea que comienza con "mytz = ...". time.timezone devuelve la zona horaria local, aunque con signo opuesto en comparación con UTC. Entonces dice "-3600" para expresar UTC + 1.

A pesar de su ignorancia hacia el horario de verano (horario de verano, ver comentario), voy a dejar esto para la gente jugueteando con time.timezone.

+2

-1. Esto devolverá un resultado erróneo la mitad del tiempo, si se encuentra en una zona horaria que usa DST. 'time.timezone' contiene el desplazamiento a UTC que se usa cuando DST no está en efecto, independientemente de si está vigente actualmente. – Feuermurmel

10

Creo que la mejor manera de hacer esto es utilizar la clase LocalTimezone definido en la documentación datetime.tzinfo (Goto http://docs.python.org/library/datetime.html#tzinfo-objects y vaya a la sección "Ejemplo tzinfo clases"):

Suponiendo Local es una instancia de LocalTimezone

t = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=utc) 
local_t = t.astimezone(Local) 

continuación str(local_t) da:

'2009-07-11 04:44:59.193982+10:00' 

que es lo que quieres.

(Nota: esto puede parecer extraño a usted porque estoy en Nueva Gales del Sur, Australia, que es de 10 o 11 horas por delante de UTC)

+1

Si ha definido Local por los documentos datetime, esto también funciona: 'str (datetime.datetime.now (tz = Local))' – hobs

+0

Tenga en cuenta que esto imprimirá cualquier uso con el desplazamiento UTC que está actualmente en vigencia, que puede no ser el mismo que estuvo o estará vigente en el momento dado por la instancia 'datetime' (debido a DST). – Feuermurmel

+0

'LocalTimezone' podría fallar en fechas pasadas si la implementación' time' subyacente no utiliza una base de datos histórica de zona horaria (Windows se encuentra notablemente en esta categoría). – jfs

0

Yo uso esta función datetime_to_local_timezone(), que parece demasiado complicado, pero no he encontrado ninguna versión más simple de una función que convierte una instancia datetime a la zona horaria local, como se ha configurado en el sistema operativo , con el desplazamiento de UTC que estaba en vigor en ese momento :

import time, datetime 

def datetime_to_local_timezone(dt): 
    epoch = dt.timestamp() # Get POSIX timestamp of the specified datetime. 
    st_time = time.localtime(epoch) # Get struct_time for the timestamp. This will be created using the system's locale and it's time zone information. 
    tz = datetime.timezone(datetime.timedelta(seconds = st_time.tm_gmtoff)) # Create a timezone object with the computed offset in the struct_time. 

    return dt.astimezone(tz) # Move the datetime instance to the new time zone. 

utc = datetime.timezone(datetime.timedelta()) 
dt1 = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, utc) # DST was in effect 
dt2 = datetime.datetime(2009, 1, 10, 18, 44, 59, 193982, utc) # DST was not in effect 

print(dt1) 
print(datetime_to_local_timezone(dt1)) 

print(dt2) 
print(datetime_to_local_timezone(dt2)) 

Este ejemplo imprime cuatro fechas. Por dos momentos en el tiempo, uno en enero y otro en julio de 2009, cada uno, imprime la marca de tiempo una vez en UTC y una vez en la zona horaria local.Aquí, donde CET (UTC + 01: 00) se utiliza en el CET invierno y (GMT + 02: 00) se utiliza en el verano, se imprime el siguiente:

2009-07-10 18:44:59.193982+00:00 
2009-07-10 20:44:59.193982+02:00 

2009-01-10 18:44:59.193982+00:00 
2009-01-10 19:44:59.193982+01:00 
+0

Parece código Python 3.3+ (método '.timestamp()') En este caso podría usar un código más simple: ['dt.astimezone (tz = None)'] (http://stackoverflow.com/a/ 13287083/4279). También use 'timezone.utc' en lugar de' timezone (datetime.timedelta()) '. – jfs

0

A partir de Python 3.2, utilizando sólo funciones de la biblioteca estándar:

u_tm = datetime.datetime.utcfromtimestamp(0) 
l_tm = datetime.datetime.fromtimestamp(0) 
l_tz = datetime.timezone(l_tm - u_tm) 

t = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=l_tz) 
str(t) 
'2009-07-10 18:44:59.193982-07:00' 

sólo tiene que utilizar l_tm - u_tm o u_tm - l_tm dependiendo si desea mostrar como + o - hora de UTC. Estoy en MST, que es de donde proviene el -07. El código más inteligente debería poder descifrar qué camino restar.

Y solo necesita calcular la zona horaria local una vez. Esto no va a cambiar. Al menos hasta que cambie de/a horario de verano.

Cuestiones relacionadas