2009-11-05 10 views

Respuesta

7
>>> import datetime 
>>> today = datetime.datetime.now() 
>>> insummer = datetime.datetime(2009,8,15,10,0,0) 
>>> from pytz import reference 
>>> localtime = reference.LocalTimezone() 
>>> localtime.tzname(today) 
'PST' 
>>> localtime.tzname(insummer) 
'PDT' 
>>> 
+4

[' pytz' docs di que 'pytz.reference'] (http://pytz.sourceforge.net/#problems-with-localtime) se debe utilizar * solo para las pruebas *. – jfs

+0

Esa advertencia se aplica a 'reference.USTimeZone', que usa las reglas anteriores a 2007 para DST de EE. UU. Sin embargo, 'reference.LocalTimezone', utilizado aquí, prueba el comportamiento de' time.localtime', cuya corrección se mantiene con las bibliotecas del sistema. 'reference.LocalTimezone' proporciona las transiciones DST correctas tanto antes como después del cambio de 2007 en las reglas de EE. UU .; No he probado para otros países. – rob

+2

@rob: ** incorrecto **. No use 'LocalTimezone()'. 'pytz' proporciona datos * históricos * de zona horaria, mientras que' time.timezone', 'time.altzone' (utilizado por' LocalTimezone() ') son constantes, es decir, en el mejor de los casos reflejan * la definición de zona horaria * más reciente. La zona horaria local puede tener diferentes desplazamientos utc en el pasado/futuro, por ejemplo, pruebe la zona horaria de Europa/Moscú en 2010-2015 y vea lo que sucede por sí mismo. – jfs

2

time.timezone declaraciones de zona horaria local actual. También hay un datetime.tzinfo, si necesita una estructura más complicada.

+0

time.timezone() simplemente devuelve el desplazamiento de UTC. quiero un objeto tzinfo. así que probablemente sería cuál es la función de: 1. definir una clase correspondiente al objeto tzinfo 2. instanciar el objeto 3. devolverlo –

+0

'datetime' docs tiene un ejemplo que explica el uso de' tzinfo'. – SilentGhost

+0

'datetime.datetime.now() + datetime.timedelta (seconds = time.timezone)' hizo el truco muy bien. – Baczek

0

quizás tratar:

import time

print time.tzname # o time.tzname[time.daylight]

+0

Compare esto con la primera respuesta, ¿por qué -1? –

+0

['time.daylight'] dice si la zona horaria actual tiene DST. No indica si el horario de verano está vigente en este momento. Además 'time.tzname' no es una instancia' tzinfo' (es una cadena). Consulte [Cómo obtener la configuración de zona horaria del sistema y páselo a pytz.timezone?] (Http://stackoverflow.com/q/13218506/4279) para comprender que incluso si obtiene el tzname correcto; no significa que encontraría la zona horaria local. Ver [Obtención del desplazamiento de utc de la computadora en Python] (http://stackoverflow.com/a/3168394/4279) que muestra varios enfoques para obtener el offset de utc actual. – jfs

7

tzlocal module que devuelve pytz zonas horarias funciona en * nix y Win32:

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

# get local timezone  
local_tz = get_localzone() 


print local_tz.localize(datetime(2012, 1, 15)) 
# -> 2012-01-15 00:00:00+04:00 # current utc offset 
print local_tz.localize(datetime(2000, 1, 15)) 
# -> 2000-01-15 00:00:00+03:00 # past utc offset (note: +03 instead of +04) 
print local_tz.localize(datetime(2000, 6, 15)) 
# -> 2000-06-15 00:00:00+04:00 # changes to utc offset due to DST 

Nota: tiene en cuenta los cambios de desplazamiento utc DST y no DST.

-1

que estaba preguntando lo mismo a mí mismo, y me encontré la respuesta en [1]:

Tome un vistazo a la sección 8.1.7: el formato "% z" (en minúsculas, las mayúsculas Z vuelve también la zona horaria, pero no en el formato de 4 dígitos, pero en forma de abreviaturas de zona horaria, como en [3]) de strftime devuelve el formulario "+/- 4DIGIT" que es estándar en los encabezados de correo electrónico (consulte la sección 3.3 de RFC 2822 , ver [2], que obsoleta las otras formas de especificar la zona horaria para los encabezados de correo electrónico).

lo tanto, si usted quiere que su zona horaria en este formato, utilice:

time.strftime("%z") 

[1] http://docs.python.org/2/library/datetime.html

[2] http://tools.ietf.org/html/rfc2822#section-3.3

[3] abreviaturas Zona horaria: http://en.wikipedia.org/wiki/List_of_time_zone_abbreviations, sólo para referencia.

+0

No da el objeto 'tzinfo'. Puede obtener el offset de utc actual para la zona horaria local como número de segundos: '-altzone if daylight y localtime(). Tm_isdst> 0 else -timezone' (todos los nombres son del módulo' time'). – jfs

3

Este siguiente fragmento de código devuelve tiempo en una zona horaria diferente, independientemente de la zona horaria configurada en el servidor.

# pip install pytz tzlocal 

from tzlocal import get_localzone 
from datetime import datetime 
from pytz import timezone 

local_tz = get_localzone() 
local_datetime = datetime.now(local_tz) 

zurich_tz = timezone('Europe/Zurich') 
zurich_datetime = zurich_tz.normalize(local_datetime.astimezone(zurich_tz)) 
+1

¿Hay alguna razón para no usar 'zurich_datetime = datetime.now (timezone ('Europe/Zurich'))' aquí? Por cierto, [no es necesario llamar a '.normalize()' después de '.astimezone()'] (https://answers.launchpad.net/pytz/+question/249229#6) – jfs

Cuestiones relacionadas