Tengo una instancia de fecha y hora de Python que se creó usando datetime.utcnow () y persistió en la base de datos.
Para la visualización, me gustaría convertir la instancia de fecha y hora recuperada de la base de datos a la fecha y hora local usando la zona horaria local predeterminada (es decir, como si la fecha y hora se hubiera creado usando datetime.now ()).
¿Cómo puedo convertir la fecha y hora UTC en una fecha y hora local usando solo la biblioteca estándar de Python (por ejemplo, sin dependencia de Pytz)?
Parece que una solución sería usar datetime.astimezone (tz), pero ¿cómo obtendría la zona horaria local predeterminada?
python
datetime
timezone
python-datetime
Nitro Zark
fuente
fuente
Respuestas:
En Python 3.3+:
En Python 2/3:
Usando
pytz
(ambos Python 2/3):Ejemplo
Salida
Python 3.3 Python 2 PytzNota: tiene en cuenta el horario de verano y el cambio reciente de compensación de utc para la zona horaria de MSK.
No sé si las soluciones que no son de Pytz funcionan en Windows.
fuente
.normalize()
porque la zona horaria de origen.astimezone()
es UTC.TypeError: replace() takes no keyword arguments
al probar la solución pytz.local_dt.replace(tzinfo=None).astimezone(tz=timezone.utc)
No puede hacerlo solo con la biblioteca estándar, ya que la biblioteca estándar no tiene zonas horarias. Necesitas pytz o dateutil .
O bien, puede hacerlo sin pytz o dateutil implementando sus propias zonas horarias. Pero eso sería una tontería.
fuente
No puedes hacerlo con la biblioteca estándar. Usando el módulo pytz puedes convertir cualquier objeto datetime ingenuo / consciente a cualquier otra zona horaria. Veamos algunos ejemplos usando Python 3.
Para convertir un objeto ingenuo a cualquier otra zona horaria, primero debe convertirlo en un objeto de fecha y hora consciente . Puede usar el
replace
método para convertir un objeto datetime ingenuo en un objeto datetime consciente . Luego, para convertir un objeto datetime consciente a cualquier otra zona horaria, puede usar elastimezone
método.La variable
pytz.all_timezones
le proporciona la lista de todas las zonas horarias disponibles en el módulo pytz.Debido a que el
now
método devuelve la fecha y la hora actuales, primero debe tener en cuenta la zona horaria del objeto datetime. Lalocalize
función convierte un objeto datetime ingenuo en un objeto datetime con reconocimiento de zona horaria. Luego puede usar elastimezone
método para convertirlo en otra zona horaria.fuente
Creo que lo descubrí: calcula el número de segundos desde la época, luego lo convierte en un timzeone local usando time.localtime, y luego convierte la estructura del tiempo en una fecha y hora ...
Aplica el horario de verano / invierno correctamente:
fuente
utctotimestamp(utc_dt) -> (seconds, microseconds)
de su código para mayor claridad, vea la implementación de Python 2.6-3.xSobre la base del comentario de Alexei. Esto también debería funcionar para el horario de verano.
fuente
La biblioteca estándar de Python no viene con ninguna
tzinfo
implementación en absoluto. Siempre he considerado esto como una deficiencia sorprendente del módulo de fecha y hora.La documentación para la clase tzinfo viene con algunos ejemplos útiles. Busque el bloque de código grande al final de la sección.
fuente
os
módulo podría haber proporcionado uno para la hora local en función de las funciones del sistema operativo.Python 3.9 agrega el
zoneinfo
módulo, por lo que ahora se puede hacer de la siguiente manera (solo stdlib):Europa Central está 1 o 2 horas por delante de UTC, por lo que
local_aware
es:como
str
:Windows no tiene una base de datos de zona horaria del sistema, por lo que aquí se necesita un paquete adicional:
Hay un backport para permitir su uso en Python 3.6 a 3.8 :
Luego:
fuente
zoneinfo
aquí: vea la primera parte de la respuesta de jfs (la parte Python3.3 +) ;-)ZoneInfo('localtime')
es mucho más claro quetz=None
(después de todo, uno podría esperartz=None
eliminar la zona horaria o devolver UTC en lugar de localtime).Una forma simple (pero tal vez defectuosa) que funciona en Python 2 y 3:
Su ventaja es que es trivial escribir una función inversa
fuente
time.timezone
que no tiene en cuenta el horario de verano.La forma más fácil que he encontrado es obtener el desplazamiento de tiempo de donde estás , luego restar eso de la hora.
Esto funciona para mí, en Python 3.5.2.
fuente
Aquí hay otra forma de cambiar la zona horaria en formato de fecha y hora (sé que desperdicié mi energía en esto, pero no vi esta página, así que no sé cómo) sin min. y sec. porque no lo necesito para mi proyecto:
fuente
Esta es una forma terrible de hacerlo, pero evita crear una definición. Cumple el requisito de seguir con la biblioteca básica de Python3.
fuente
Use timedelta para cambiar entre zonas horarias. Todo lo que necesita es el desplazamiento en horas entre zonas horarias. No tiene que jugar con los límites de los 6 elementos de un objeto de fecha y hora. timedelta maneja los años bisiestos, los siglos bisiestos, etc., también, con facilidad. Primero debes
Entonces, si
offset
es la zona horaria delta en horas:timeout = timein + timedelta(hours = offset)
donde timein y timeout son objetos datetime. p.ej
timein + timedelta(hours = -8)
convierte de GMT a PST.
Entonces, ¿cómo determinarlo
offset
? Aquí hay una función simple, siempre que solo tenga algunas posibilidades de conversión sin usar objetos de fecha y hora que sean "conscientes" de la zona horaria, lo que algunas otras respuestas hacen muy bien. Un poco manual, pero a veces la claridad es mejor.Después de mirar las numerosas respuestas y jugar con el código más ajustado que se me ocurre (por ahora) parece mejor que todas las aplicaciones, donde el tiempo es importante y se deben tener en cuenta las zonas horarias mixtas, deben hacer un esfuerzo real para hacer todos los objetos de fecha y hora "consciente". Entonces parece que la respuesta más simple es:
para convertir a GMT por ejemplo. Por supuesto, para convertir a / desde cualquier otra zona horaria que desee, local o de otro tipo, simplemente use la cadena de zona horaria apropiada que Pytz entiende (de pytz.all_timezones). El horario de verano también se tiene en cuenta.
fuente