usamos cookies para personalizar el contenido y los anuncios, para proporcionar funciones de redes sociales y para analizar nuestro tráfico. También compartimos información sobre su uso de nuestro sitio con nuestros socios de redes sociales, publicidad y análisis.Ver los detalles
tiempo de leer:10minutos
Marcos Tozzi
Lo que tengo que hacer
Tengo un objeto de fecha y hora que no conoce una zona horaria al que necesito agregar una zona horaria para poder compararlo con otros objetos de fecha y hora que conocen la zona horaria. Para este caso heredado, no quiero cambiar toda mi aplicación sin conocer la zona horaria.
lo que probé
Primero, para ilustrar el problema:
Python 2.6.1 (r261:67515, 24 de junio de 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. compilación 5646)] en darwinEscriba "ayuda", "derechos de autor", "créditos" o "licencia" para más información.>>> import datetime>>> import pytz>>> inconsciente = datetime.datetime(2011,8,15,8,15,12,0)>>> inconscientedatetime.datetime(2011, 8, 15, 8 , 15, 12)>>> consciente = fechahora.fechahora(2011,8,15,8,15,12,0,pytz.UTC)>>> conscienciahora.fechahora(2011, 8, 15, 8, 15, 12 , tzinfo=)>>> consciente == no consciente Rastreo (última llamada más reciente): Archivo "", línea 1, en Error de tipo: no se pueden comparar las fechas y horas de compensación ingenua y compensación
Primero probé astimezone:
>>> unaware.astimezone(pytz.UTC)Traceback (última llamada más reciente): Archivo "", línea 1, en ValueError: astimezone() no se puede aplicar a una fecha y hora ingenua>>>
No es particularmente sorprendente que esto haya fallado ya que en realidad es una conversión. Reemplazar parecía una mejor opción (según ¿Cómo obtengo un valor de datetime.today() que es "consciente de la zona horaria" en Python?):
>>> unaware.replace(tzinfo=pytz.UTC)datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=)>>> unaware == awarenessTraceback (última llamada más reciente): Archivo "", línea 1, en TypeError: no se pueden comparar las fechas horarias ingenuas y conscientes de la compensación>>>
Pero como puede ver, replace parece estar configurando tzinfo pero no haciendo que el objeto lo sepa. Me estoy preparando para manipular la cadena de entrada nuevamente para obtener una zona horaria antes de analizar (uso dateutil para analizar si eso importa), pero eso me parece increíblemente engorroso.
Además, probé esto tanto en Python 2.6 como en Python 2.7 con los mismos resultados.
contexto
Estoy escribiendo un analizador para algunos archivos de datos. Hay un formato antiguo que necesito admitir donde la cadena de fecha no tiene un indicador de zona horaria. Ya he corregido la fuente de datos, pero aún necesito admitir el formato de datos anterior. Una conversión única de los datos heredados no es una opción por varias razones comerciales. Si bien generalmente no me gusta la idea de codificar una zona horaria predeterminada, parece la mejor opción en este caso. Sé con certeza razonable que todos los datos heredados en cuestión están en UTC, por lo que estoy dispuesto a correr el riesgo de no hacerlo en este caso.
inconsciente.reemplazar()
volveríaNinguno
si cambiarainconsciente
objeto disponible. Eso muestra el REPL.reemplazar()
devuelve uno nuevofecha y hora
objeto aquí.– jfs
15 de agosto de 2011 a las 16:40
Lo que necesitaba cuando vine aquí:
importar fecha y hora; fechahora.fechahora.ahora(fechahora.zonahoraria.utc)
– Martín Tomas
16 ENE 2018 a las 9:32
@MartinThoma usaría el nombre
tz
arg para que sea más legible:fechahora.fechahora.ahora(tz=fechahora.zonahoraria.utc)
– Asclepio
14 OCT 2019 a las 14:45
comozonahoraria()
ahora (a partir de 3.6) se puede llamar a un objeto ingenuo y su parámetro se puede omitir (a partir de 3.3), por lo que la solución es tan simple comoinconsciente.astimezone()
- vashekcz
25 febrero 2021 a las 21:49
Encontré el truco: Europa/París, Berlín, CET, ... tienen errores completos en Pytz y estuve en un caos de inestabilidad durante meses debido a eso. ¡Reemplacé todo eso con dateutil.tz.gettz(…) y ahora mi código es estable y funciona! Mi consejo: ¡No uses Pytz en absoluto!
– Hervé-Guérin
29 de septiembre de 2022 a las 10:35 am
unutbu
En general, para acomodar una zona horaria de fecha/hora ingenua, use elmétodo de localización:
import datetimeimport pytzunaware = datetime.datetime(2011, 8, 15, 8, 15, 12, 0)aware = datetime.datetime(2011, 8, 15, 8, 15, 12, 0, pytz.UTC)now_aware = pytz. utc.localize(no consciente)afirmar consciente == now_aware
Para el huso horario UTC no es estrictamente necesario su usolocalizar
ya que no hay cálculo de horario de verano:
now_aware = unaware.replace(tzinfo=pytz.UTC)
funciones (.reemplazar
devuelve una nueva fecha/hora; no cambiainconsciente
.)
Bueno, me siento tonto. Reemplazar devuelve una nueva fecha y hora. Eso también está directamente en los documentos, y lo pasé por alto por completo. Gracias, eso es exactamente lo que estaba buscando.
-Mark Tozzi
15 de agosto de 2011 a las 14:24
"Reemplazar devuelve una nueva fecha/hora". La pista que le da REPL es que le muestra el valor devuelto. 🙂 🙂
– Karl Knechtel
15 de agosto de 2011 a las 14:33
Si la zona horaria no es UTC, no use el constructor directamente:
consciente = fecha y hora (..., tz)
usar.localizar()
en lugar de esto.– jfs
8 de marzo de 2014 a las 21:07
Vale la pena señalar que la hora local puede no ser única.
tz.localize(..., is_dst=Ninguno)
afirma que no es así.– jfs
8 de marzo de 2014 a las 21:10
Putz tiene un error que establece la zona horaria de Ámsterdam a +20 minutos con respecto a UTC, una zona horaria desactualizada de 1937. Tenías un trabajo, Pytz.
– Borís
18 febrero 2020 a las 16:09
kang
Todos estos ejemplos usan un módulo externo, pero puede lograr el mismo resultado usando solo el módulo de fecha y hora, como también se muestra en esta respuesta SO:
from datetime import datetime, timezonedt = datetime.now()dt = dt.replace(tzinfo=timezone.utc)print(dt.isoformat())# '2017-01-12T22:11:31+00:00'
Menos dependencias y sin problemas de Pytz.
NOTA: Si desea usar esto con Python3 y Python2, también puede usarlo para la importación de zonas horarias (codificadas en UTC):
intente: from datetime import timezone utc = timezone.utcexcept ImportError: #Hola python2 clase de usuario UTC(tzinfo): def utcoffset(self, dt): return timedelta(0) def tzname(self, dt): return "UTC" def dst(self, dt): retorno timedelta(0) utc = UTC()
Muy buena respuesta sobre prevención.
pytz
Problemas, ¡me alegro de haberme desplazado un poco hacia abajo! No quería lidiar con esopytz
en realidad en mis servidores remotos 🙂– Tregoreg
1 de febrero de 2017 a las 20:20
Tenga en cuenta que
desde la zona horaria de importación de fecha y hora
Funciona en py3 pero no en py2.7.- 7y4r
20 de febrero de 2017 a las 16:44
Debes tener en cuenta que
dt.replace(tzinfo=zonahoraria.utc)
Devuelve una nueva fecha/hora, no cambiadt
en su lugar. (Voy a editar para mostrar esto).— Blairg23
28 de marzo de 2017 a las 12:58 am
En lugar de usar timezone.utc, ¿cómo puede proporcionar una zona horaria diferente como una cadena (por ejemplo, "América/Chicago")?
- Tonto
26 SEP 2017 a las 18:36
@bumpkin más vale tarde que nunca, supongo:
tz = pytz.timezone('América/Chicago')
– Florián
13 febrero 2019 a las 11:40 am
sergi
Escribí este script de Python 2 en 2011 pero nunca verifiqué si funciona en Python 3.
Había cambiado de dt_aware a dt_unaware:
dt_unaware = dt_aware.replace(tzinfo=Ninguno)
y dt_unware a dt_aware:
from pytz import timezonelocaltz = timezone('Europa/Lisboa')dt_aware = localtz.localize(dt_unware)
podrías usar
localtz.localize(dt_unware, is_dst=Ninguno)
lanzar una excepción sidt_unware
representa una hora local inexistente o ambigua (nota: no hubo tal problema en la revisión anterior de su respuestalocaltz
era UTC, ya que no hay transiciones de horario de verano en UTC– jfs
15 de mayo de 2014 a las 19:55
@JF Sebastian, primer comentario aplicado
– sergio
15. mayo 2014 a las 20:59
Me alegra que muestres ambas direcciones de conversión.
– Christian Lange
24 de junio de 2016 a las 1:08 am
@Sérgio y si coloca ese argumento en .replace y obtiene "TypeError: replace() obtuvo un argumento de palabra clave inesperado 'tzinfo'"? ¿Qué puedes hacer con este problema?
-Gustavo Rottgering
22 junio 2020 a las 19:36
Google
Uso esta declaración en Django para convertir un tiempo inconsciente en uno consciente:
de django.utils import timezonedt_aware = timezone.make_aware(dt_unaware, timezone.get_current_timezone())
xjcl
Python 3.9 agrega quezonainfo
Módulo¡Así que ahora solo se necesita la biblioteca estándar!
from zoneinfo import ZoneInfofrom datetime import datetimeunaware = datetime(2020, 10, 31, 12)
Añadir una zona horaria:
>>> unaware.replace(tzinfo=ZoneInfo('Asia/Tokyo'))datetime.datetime(2020, 10, 31, 12, 0, tzinfo=zoneinfo.ZoneInfo(key='Asia/Tokyo'))>>> str(_)'2020-10-31 12:00:00+09:00'
Agregue la zona horaria local del sistema:
>>> unaware.replace(tzinfo=ZoneInfo('localtime'))datetime.datetime(2020, 10, 31, 12, 0, tzinfo=zoneinfo.ZoneInfo(key='localtime'))>>> str(_) '2020-10-31 12:00:00+01:00'
Luego se convierte correctamente a otras zonas horarias:
>>> unaware.replace(tzinfo=ZoneInfo('localtime')).astimezone(ZoneInfo('Asia/Tokyo'))datetime.datetime(2020, 10, 31, 20, 0, tzinfo=backports.zoneinfo.ZoneInfo( clave='Asia/Tokio'))>>> str(_)'2020-10-31 20:00:00+09:00'
Lista de Wikipedia de zonas horarias disponibles
ventanas no tieneBase de datos de zona horaria del sistema, por lo que se requiere un paquete adicional aquí:
pip instalar tzdata
Hay un backport que permite su uso.zonainfo
EnPitón 3.6 a 3.8:
pip instalar backports.zoneinfo
Entonces:
desde backports.zoneinfo importar ZoneInfo
En Windows, también debe hacer esto
pip instalar tzdata
– Fobersteiner
11 junio 2020 a las 17:19
@MrFuppes ¡Gracias por el consejo! Probaré esto mañana y lo convertiré en mi respuesta. ¿Sabes cómo está la situación en Mac?
– xjcl
11 junio 2020 a las 22:32
@xjcl necesitas
pip instalar tzdata
en cualquier plataforma donde el sistema operativo no proporcione una base de datos de zonas horarias. Las Mac deberían funcionar de inmediato. La instalación no dolerátzdata
incondicionalmente (ya que los datos del sistema tienen prioridad).tzdata
) si su aplicación requiere datos de zona horaria.- Pablo
21 de septiembre de 2020 a las 19:29
@xjcl tzdata es prácticamente parte de la biblioteca estándar (lo llamamos "paquete de origen"), solo necesita pip ya que tiene una cadencia de lanzamiento mucho más rápida que CPython.
- Pablo
27 de septiembre de 2020 a las 00:18
Quería mencionar que es muy fácil agregar condicionalmente esto al archivo requirements.txt solo en Windows:
tzdata; plataforma_sys == "win32"
(en: stackoverflow.com/a/35614580/705296)–Joe Sadoski
31 de mayo de 2022 a las 14:37
Estoy de acuerdo con las respuestas anteriores y está bien si puede comenzar en UTC. Pero creo que también es un escenario común para las personas trabajar con un valor consciente de TZ que tiene undatetime, que tiene una zona horaria local no UTC.
Si acaba de dar el nombre, probablemente concluiría que replace() es aplicable y crea el objeto correcto con detección de fecha/hora. Ese no es el caso.
El replace( tzinfo=… ) parece ser aleatorio en su comportamiento. Por lo tanto, es inútil. ¡No uses esto!
"localizar" es la función correcta. Ejemplo:
localdatetime_aware = tz.localize(datetime_nonaware)
O un ejemplo más completo:
import pytzfrom datetime import datetimepytz.timezone('Australia/Melbourne').localize(datetime.now())
me da un valor de fecha/hora relativo a la zona horaria de la hora local actual:
datetime.datetime(2017, 11, 3, 7, 44, 51, 908574, tzinfo=)
En Windows, también debe hacer esto
pip instalar tzdata
– Fobersteiner
11 junio 2020 a las 17:19
@MrFuppes ¡Gracias por el consejo! Probaré esto mañana y lo convertiré en mi respuesta. ¿Sabes cómo está la situación en Mac?
– xjcl
11 junio 2020 a las 22:32
@xjcl necesitas
pip instalar tzdata
en cualquier plataforma donde el sistema operativo no proporcione una base de datos de zonas horarias. Las Mac deberían funcionar de inmediato. La instalación no dolerátzdata
incondicionalmente (ya que los datos del sistema tienen prioridad).tzdata
) si su aplicación requiere datos de zona horaria.- Pablo
21 de septiembre de 2020 a las 19:29
@xjcl tzdata es prácticamente parte de la biblioteca estándar (lo llamamos "paquete de origen"), solo necesita pip ya que tiene una cadencia de lanzamiento mucho más rápida que CPython.
- Pablo
27 de septiembre de 2020 a las 00:18
Quería mencionar que es muy fácil agregar condicionalmente esto al archivo requirements.txt solo en Windows:
tzdata; plataforma_sys == "win32"
(en: stackoverflow.com/a/35614580/705296)–Joe Sadoski
31 de mayo de 2022 a las 14:37
Daniel
Usardateutil.tz.tzlocal()
para obtener la zona horaria en su usofechahora.fechahora.ahora()
Ydatetime.datetime.astimezone()
:
from datetime import datetimefrom dateutil import tzunlocalisedDatetime = datetime.now()localisedDatetime1 = datetime.now(tz = tz.tzlocal())localisedDatetime2 = datetime(2017, 6, 24, 12, 24, 36, tz.tzlocal())localisedDatetime3 = fechahoranolocalizada.astimezone(tz = tz.tzlocal())fechahoralocalizada4 = fechahoranolocalizada.replace(tzinfo = tz.tzlocal())
Tenga en cuenta quedatetime.astimezone
convertirá el tuyo primerofecha y hora
Mueva el objeto a UTC y luego a la zona horaria, lo que equivale a llamarlofechahora.reemplazar
con la información de la zona horaria originalNinguno
.
Si quieres que sea UTC:
.replace(tzinfo=dateutil.tz.UTC)
– Martín Tomas
19 agosto 2019 a las 6:08 am
Una importación menos y solo:
.replace(tzinfo=fechahora.zonahoraria.utc)
– kubanczyk
9 de abril de 2020 a las 3:16 p. m.
14503100comprobación de cookiesCómo hacer que un objeto de fecha y hora sea consciente (no ingenuo)
#Pitón #zona horaria
FAQs
¿Cómo hago que una zona horaria de fecha y hora sea consciente? ›
Para hacer que un objeto de fecha y hora sea consciente de la compensación, puede usar la biblioteca pytz . Primero, debe crear una instancia de un objeto de zona horaria y luego usar ese objeto de zona horaria para "localizar" un objeto de fecha y hora. La localización simplemente proporciona información sobre la zona horaria del objeto.
¿Qué es una fecha y hora ingenua? ›Los llamamos "ingenuos" porque esta representación de fecha y hora no tiene una zona horaria . Esto significa que la fecha y hora puede no existir en ciertas áreas del mundo aunque sea válida. Por ejemplo, cuando una región aplica los cambios de horario de verano, el reloj normalmente avanza o retrocede una hora.
¿Cómo sabes si datetime es ingenuo? ›Si un objeto de fecha y hora tiene información de zona horaria, lo sabrá. De lo contrario, será ingenuo . En el caso de un objeto de fecha y hora ingenuo, tzinfo será Ninguno y la hora estará en UTC (+00:00).
¿Cómo usar la fecha y hora de la zona horaria de Python? ›Puede obtener la hora actual en una zona horaria particular usando el módulo de fecha y hora con otro módulo llamado pytz. A continuación, puede comprobar todas las zonas horarias disponibles con el siguiente fragmento: from datetime import datetime import pytz zones = pytz. all_timezones print(zones) # Salida: todas las zonas horarias del mundo .
¿Cómo establecer zona horaria de forma manual? ›- Abre la app de Reloj del teléfono .
- Presiona Más. Configuración. Para elegir la zona horaria de tu región, presiona Zona horaria local. Para actualizar automáticamente tu zona horaria, presiona Cambiar fecha y hora. Establecer zona horaria automáticamente.
Los dispositivos Android cambian su hora de forma automática en función de la zona horaria. Esto permite que las modificaciones solo sean por hora y no por minutos.
¿Cómo saber cuál es la hora exacta? ›Para este propósito, los particulares pueden consultar el portal https://www.cenam.mx/hora_oficial/default2.aspx, el cual muestra la Hora Oficial que corresponde a las distintas zonas horarias en el país.
¿Qué es un dato Fecha hora? ›Una fecha es un valor de tres partes que representa un año, mes y día dentro del rango de 0001-01-01 a 9999-12-31. Una hora es un valor de tres partes que representa una hora del día en horas, minutos y segundos dentro del rango de 00.00.00 a 24.00.00.
¿Cuál es la hora local IDL? ›La IDL es una línea imaginaria que coincide en buena parte con el meridiano 180° y cruza la mitad del Océano Pacífico. Esto fue una iniciativa del ingeniero canadiense de origen escocés Sandford Fleming (1827-1915) a quien también se le debe el uso de las zonas horarias y el tiempo universal (UT).
¿Qué es el tiempo ingenuo? ›Entonces, ¿qué es exactamente una fecha ingenua o un tiempo ingenuo? Se les llama "ingenuos" porque no tienen una zona horaria asociada a ellos . Por ejemplo: - fecha ingenua: "2017-09-29" - hora ingenua: "15:00:00" - fecha y hora ingenua: "2017-09-29T15:00:00"
¿Cómo obtener solo la fecha de un DateTime? ›
- Usando DateTime.ToString() método. los DateTime. ...
- Usando DateTime. ToShortDateString() método. ...
- Usando DateTime. ToLongDateString() método. ...
- Uso DateTime. GetDateTimeFormats() método.
El comando date es un comando existente en sistemas Unix y tipo unix que muestra la hora y la fecha del sistema y el administrador también puede cambiarla. Este comando apareció en la primera versión de Unix.
¿Cómo establecer la fecha en Python? ›Para crear una fecha, podemos usar la clase datetime() (constructor) del módulo datetime . La clase datetime() requiere tres parámetros para crear una fecha: año, mes, día.
¿Cómo extraer la hora de una fecha en Python? ›Para obtener la hora actual en Python se utiliza la función now de la clase datetime de la librería datetime . Podemos indicarle por parámetro una zona horaria. Es posible obtener la hora de un servidor de NTP utilizando la librería ntplib . Para formatear la hora se utiliza la función strftime .
¿Cómo cambio el formato de fecha en Python? ›Para convertir un objeto de fecha y hora en una cadena usando el formato especificado, use datetime. strftime(formato) . Los códigos de formato son directivas estándar para especificar el formato en el que desea representar la fecha y la hora. Los códigos %d-%m-%Y%H:%M:%S, por ejemplo, convierten las fechas al formato dd-mm-aaaa hh:mm:ss.
¿Cómo desactivar definir automáticamente la hora? ›En Android
Primero debes ir a "Ajustes", bajar y seleccionar "Sistema y Actualizaciones" y pasar a "Fecha y Hora". Allí desactiva la opción "Configuración automática" y eliges la zona horaria que deseas.
Para que Windows establezca automáticamente la zona horaria, debe asegurarse de que los servicios de ubicación no estén deshabilitados en su computadora . Si el servicio en sí está deshabilitado y no puede obtener su ubicación, es posible que Windows no le permita habilitar la configuración automática de la zona horaria.
¿Cómo configurar la hora en un reloj inteligente? ›- Si la pantalla está atenuada, presiónala para activar el reloj.
- Desliza el dedo hacia abajo desde la parte superior de la pantalla.
- Presiona Configuración . Si no ves la opción de inmediato, desliza el dedo hacia la izquierda.
- Presiona Sistema Fecha y hora. Elige tu configuración de hora.
Inserte una fecha de hoy y hora actual automáticamente actualizable. Si desea ingresar la fecha de hoy en Excel que siempre estará actualizada, use una de las siguientes funciones de fecha de Excel: =HOY() - inserta la fecha de hoy en una celda.
¿Cómo desactivo la fecha y hora automáticas en Android? ›Toque Configuración para abrir el menú Configuración. Presiona Fecha y hora. Presiona Automático . Si esta opción está desactivada, verifique que se hayan seleccionado la fecha, la hora y la zona horaria correctas.
¿Cómo funciona la fecha y hora automáticas de Android? ›
Es posible que se requiera la configuración automática de fecha y hora si se empareja con una aplicación, otro dispositivo o un accesorio. Active Fecha y hora automáticas tocando el interruptor o la casilla de verificación . Habilitado cuando el interruptor está en la posición 'Encendido' o cuando hay una marca de verificación presente. Active Zona horaria automática tocando el interruptor o la casilla de verificación.
¿Qué dispositivo tiene la hora más precisa? ›Los relojes atómicos son tan precisos que perderán un segundo aproximadamente cada 100 millones de años; como referencia, el reloj de cuarzo promedio perderá un segundo cada dos años.
¿Cómo almacenar fecha y hora? ›Para insertar la fecha y hora actuales, presione CTRL+; (punto y coma), después ESPACIO y, finalmente, CTRL+MAYÚS+.
¿Cómo transformar un dato en fecha? ›Seleccione una celda en blanco y compruebe que su formato de número es General. Haga clic en la celda que contiene la fecha con formato de texto que desea convertir. Presione ENTRAR y la función FECHANUMERO devuelve el número de serie de la fecha representada por la fecha de texto.
¿Cuál es el tipo de variable de fecha y hora? ›Una variable de tipo DATETIME almacena una fecha más una hora calculada en microsegundos . El tipo de datos DATETIME representa valores desde 4713 BCE (BC) hasta 19999 CE (AD).
¿Cómo cambiar la zona horaria en Excel? ›- Abre la hoja de cálculo.
- Haz clic en Archivo > Configuración de hoja de cálculo.
- Puedes modificar la zona horaria y la configuración regional en la ventana que aparecerá.
- Haz clic en Guardar configuración.
Cómo cambiar tus preferencias de fecha y hora
Selecciona Configuración . Desplázate hacia abajo y selecciona Avanzada. Ve a la sección "Fecha y hora": Para elegir manualmente la zona horaria, selecciona Zona horaria.
Por ejemplo: =FECHA(C2; A2; B2) combina el año de la celda C2, el mes de la celda A2 y el día de la celda B2, y los coloca en una celda como fecha.
¿Por qué Google Calendar muestra una zona horaria incorrecta? ›Google Calendar utiliza la hora universal coordinada (UTC) para ayudar a evitar problemas con el horario de verano. Cuando se crean eventos, se convierten a UTC, pero siempre los verá en su hora local. Si un área cambia su zona horaria, los eventos creados antes de que supiéramos del cambio podrían estar en la zona horaria incorrecta .
¿Cómo cambio la fecha y la hora en mi navegador Chrome? ›Cambia tus preferencias de fecha y hora
Seleccione Configuración. Desplácese hacia abajo y seleccione Avanzado. En la sección "Fecha y hora": Para elegir manualmente tu zona horaria, selecciona Zona horaria.
¿Cómo solucionar el error de reloj en Google Chrome? ›
Para corregir el error, haz clic en Conectar en la página que intentas abrir. Se muestra este error si son incorrectas la fecha y hora de la computadora o dispositivo móvil. Para solucionar este error, abre el reloj del dispositivo Asegúrate de que la fecha y hora sean correctas.