Suele suceder que nos encontramos desarrollando algún proyecto y nos surge la necesidad de obtener la hora actual. Por ejemplo, para registrar la hora de una compra. O para comprobar cuándo debemos encender la calefacción. Normalmente la podemos obtener el sistema o de un servidor de tiempo (NTP, Network Time Protocol). Te explico aquí cómo puedes obtener la hora actual 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
.
Bueno, sin más dilación, vamos desgranando todo esto paso a paso.
Obtener la hora actual del sistema
La librería estándar de Python datetime
nos proporciona clases y funcionalidades para trabajar con fechas y horas.
Una de las principales clases que contiene es datetime
. Esta clase está pensada para manejar tanto fechas como horas, o ambas cosas combinadas.
Puede resultar un poco confuso porque coinciden los nombres de la librería con el de la clase, ambos son datetime
. A menudo encontrarás líneas de código con la expresión datetime.datetime
. Recuerda que el primero es la librería y el segundo el nombre de la clase.
La clase datetime
posee un método de clase llamado now
que obtiene la hora del sistema y nos la devuelve en un objeto datetime
.
Así, con la siguiente llamada obtendrás el objeto que representa el momento actual en tu sistema y podrás operar con él:
import datetime
hora_actual = datetime.datetime.now()
print(hora_actual)
Si imprimimos el objeto hora_actual
por pantalla obtenemos la siguiente salida (que depende de la hora, claro, en mi caso es esta):
2022-10-21 12:56:19.007770
Como puedes ver, obtenemos más información que la hora porque también tenemos la fecha. Además, tenemos la fracción del segundo en el que nos encontramos hasta el nivel de microsegundos.
Vamos a ignorar de momento las fechas.
La clase datetime
tiene cuatro atributos principales a los que podremos acceder para obtener de manera individual la hora, el minuto, el segundo y el microsegundo. Estos atributos son, respectivamente, hour
, minute
, second
y microsecond
.
Vamos, entonces, a obtener la hora actual y a mostrarla por pantalla. Después accederemos de manera individual a esos atributos y los mostraremos por pantalla también:
import datetime
hora_actual = datetime.datetime.now()
print(hora_actual)
print(hora_actual.hour)
print(hora_actual.minute)
print(hora_actual.second)
print(hora_actual.microsecond)
El resultado es el siguiente:
2022-10-21 13:07:04.155589 13 7 4 155589
Como puedes ver, cuando imprimimos directamente el objeto obtenemos una cadena de texto formateada (más adelante veremos cómo cambiar el formato). En cambio, cuando imprimimos de manera individual los componentes, solo tenemos un valor entero (int
) sin ningún tipo de formato, evidentemente. No obstante, puedes comprobar que los valores son los mismos.
Otra posibilidad radica en invocar al método time()
del objeto devuelto por now()
. Esto nos devolverá un objeto de la clase time
que solo contiene los campos de la hora. También podemos acceder a atributos como los vistos antes. Lo vemos:
import datetime
hora_actual = datetime.datetime.now().time()
print(hora_actual)
print(hora_actual.hour)
print(hora_actual.minute)
print(hora_actual.second)
print(hora_actual.microsecond)
Y el resultado:
Te envío todos los días un consejo para que cada día seas mejor en Python.
Siempre sobre Python y programación.
Más de 2500 personas como tú los reciben cada día.
Día que estás fuera, consejo sobre Python que te pierdes.
Antes de suscribirte consulta aquí la
Finalidad de recogida y tratamiento de datos personales: enviarte boletín informativo de Python y comunicaciones comerciales.
Legitimación: tu consentimiento.
Destinatarios: no se ceden a terceros. Los datos se almacenan en los servidores de marketing (GetResponse).
Derechos: podrás ejercer tus derechos de acceso, rectificación, limitación y supresión de datos en info @ codigopiton.com así como presentar una reclamación ante una autoridad de control.
Más información: política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal.
17:49:26.746729 17 49 26 746729
Obtener la fecha del sistema
Como has visto, algunos atributos nos permiten acceder directamente a los componentes de la hora en el objeto datetime
. Como puedes imaginarte, podemos hacer exactamente lo mismo para obtener los componentes de la fecha tras la llamada a now()
.
En esta ocasión contamos con los atributos day
, month
y year
para acceder, respectivamente, al día al mes y al año de la fecha actual. Lo vemos en este ejemplo:
import datetime
hora_actual = datetime.datetime.now()
print(hora_actual)
print(hora_actual.day)
print(hora_actual.month)
print(hora_actual.year)
Por pantalla obtenemos el siguiente resultado:
2022-10-21 17:41:00.278360 21 10 2022
Al igual que como veíamos antes, tras llamar a now()
podemos invocar al método date()
que nos devuelve un objeto de la clase date
que únicamente contiene la información sobre la fecha. También tenemos disponibles los atributos comentados anteriormente:
import datetime
fecha_actual = datetime.datetime.now().date()
print(fecha_actual)
print(fecha_actual.day)
print(fecha_actual.month)
print(fecha_actual.year)
Resultado:
2022-10-21 21 10 2022
Finalmente otra manera de obtener rápidamente el objeto date
con la fecha actual es invocando al método de clase today()
:
import datetime
fecha_actual = datetime.date.today()
print(fecha_actual)
Formatear la hora
Ahora que ya sabes obtener la hora actual en Python, quizá necesites aplicarle un formato propio para mostrarla a tu gusto donde necesites.
Para eso puedes utilizar el método strftime
de la clase datetime
y time
. Dicho método devuelve una cadena de texto formateada a nuestro antojo mediante una plantilla que le podemos indicar por parámetro. Esta plantilla puede estar compuesta por cualquier texto y por códigos de formato que hacen referencia a los componentes de las horas.
Veamos un ejemplo sencillo. Voy a mostrar la hora actual del sistema pero solo mostrando las horas y los minutos separados por dos puntos(:). Solo tengo que aplicar el formato %H:%M
donde %H
es el código de formato para mostrar la hora en formato 24h y %M
es el código para el minuto:
import datetime
hora_actual = datetime.datetime.now()
# alternativa
# hora_actual = datetime.datetime.now().time()
hora_formateada = hora_actual.strftime('%H:%M')
print(hora_actual)
print(hora_formateada)
Y obtenemos el siguiente resultado:
2022-10-21 18:06:00.827694 18:06
Te dejo a continuación una tabla con los principales códigos de formato disponibles y su resultado de aplicarlo a una hora determinada:
Código de formato | Descripción | Aplicado a 18:05:45 |
---|---|---|
%H | Hora en formato 24h con ceros a la izquierda | 18 |
%-H | Hora en formato 24h | 18 |
%I | Hora en formato 12h con ceros a la izquierda | 06 |
%-I | Hora en formato 12h | 6 |
%p | AM o PM | PM |
%M | Minuto con ceros a la izquierda | 05 |
%-M | Minuto | 5 |
%S | Segundo con ceros a la izquierda | 45 |
%-S | Segundo | 45 |
%f | Microsegundos con ceros a la izquierda | 000000 |
Formatear la fecha
De la misma manera que podemos formatear la hora, también podemos hacerlo con la fecha. Para ello, tenemos disponibles otros códigos de formato. Te pongo la tabla y después te muestro algún ejemplo:
Código de formato | Descripción | Aplicado a 15/07/2019 |
---|---|---|
%a | Nombre del día de la semana abreviado | lun |
%A | Nombre del día de la semana | lunes |
%w | Número de día de la semana (0 domingo - 6 sábado) | 1 |
%d | Día del mes con ceros a la izquierda | 15 |
%-d | Día del mes | 15 |
%b | Nombre del mes abreviado | jul |
%B | Nombre del mes | julio |
%m | Día del mes con ceros a la izquierda | 07 |
%-m | Día del mes | 7 |
%y | Año sin el siglo con ceros a la izquierda | 19 |
%Y | Año con el siglo | 2019 |
%j | Día del año con ceros a la izquierda | 196 |
%-j | Día del año | 196 |
%U | Semana del año (domingo primer día) con ceros a la izquierda | 28 |
%W | Semana del año (lunes primer día) con ceros a la izquierda | 28 |
Ten en cuenta que el nombre de los días y de los meses está adaptado al idioma que esté definido. Para definir el mismo que el configurado en el sistema puedes ejecutar lo siguiente en tu script:
import locale
locale.setlocale(locale.LC_ALL, '')
Como en los objetos de clase datetime
tenemos la información correspondiente tanto a la fecha como a la hora, podemos hacer uso de los códigos de formato de una o de otra o de ambos si así lo necesitamos.
Te muestro algunos ejemplos para terminar de clarificar el uso de strftime
:
import datetime
import locale
locale.setlocale(locale.LC_ALL, '')
fecha_actual = datetime.datetime.now()
print(fecha_actual)
# fechas
print(fecha_actual.strftime('%d - %m - %y'))
print(fecha_actual.strftime('%d / %m / %Y'))
print(fecha_actual.strftime('%Y%m%d'))
print(fecha_actual.strftime('%A, %-d de %B de %Y'))
# fechas y horas
print(fecha_actual.strftime('%H:%M de %d / %m / %Y'))
print(fecha_actual.strftime('%Y%m%d%H%M%S'))
Resultado por pantalla:
2022-10-21 19:28:47.189500 21 - 10 - 22 21 / 10 / 2022 20221021 viernes, 21 de octubre de 2022 19:28 de 21 / 10 / 2022 20221021192847
Obtener fecha y hora actuales por timezone
Vale, hasta aquí sabemos obtener la hora actual del sistema, pero en el mundo global en el que vivimos la hora actual depende de la zona horaria de la que te encuentres y la comunicación ha cambiado tanto que hay que tener esto en cuenta en todo momento. Por ejemplo, no es igual la hora de España, que la de México o la de Colombia. Es más, la misma puede cambiar en distintas zonas dentro del mismo país.
Hasta el momento, los objetos datetime
, date
y time
que hemos visto (con excepción del objeto devuelto por today()
) son lo que se llaman objetos naive o ingenuos respecto de la zona horaria, es decir, que no saben nada de ella. Pero podemos obtener instancias de esas mismas clases que sean de tipo aware, es decir, que sean conscientes de su zona horaria y sirvan para compararse con otras horas y fechas también conscientes de su zona horaria.
Así pues, si lo que necesitamos es obtener la hora actual de una zona horaria concreto, tendremos que proporcionar a la función now()
un parámetro extra en el que le indiquemos la zona horaria o timezone que deseemos.
15 conceptos fundamentales que necesitas conocer para aprender y dominar Python
Te voy a hacer cuatro regalos (no uno, no dos, no tres, cuatro) que hablan de estos 15 conceptos fundamentales de Python: mi Tutorial Básico Interactivo de Python, una cheat sheet de Python en español: La Hoja de Referencia de Python, una guía de ChatGPT y Python y 30 ejercicios de Python (es un reto para ti).
Estos regalos son exclusivos para los suscriptores de Código Pitón.
Para esto usaremos una nueva librería llamada zoneinfo
que maneja la información relativa a las zonas horarias.
¡Ojo! La librería zoneinfo
es parte de la librería estándar de Python desde la versión 3.9. Si utilizas una versión previa (y no tienes posibilidad de actualizarte) puedes echar un vistazo a la librería pytz
.
Debemos crear un objeto ZoneInfo
indicando la zona deseada. Después llamaremos a now
pasándole dicho objeto por parámetro, y obtendremos fecha y hora del momento actual en la zona horaria indicada.
La manera de crear el objeto ZoneInfo
es invocando al constructor proporcionándole la cadena de texto que representa la zona horaria según la base de datos de zonas horarias del IANA, como se indica en el PEP 615.
Por ejemplo, yo que vivo en Galicia, en la península ibérica, el nombre de mi zona horaria es "Europe/Madrid". Para alguien en Chihuahua sería "America/Chihuahua". Para alguien en Bogotá sería "America/Bogota". Puedes consultar de manera más cómoda la base de datos de zonas horarias en esta web de Noda Time.
Así pues, veamos un ejemplo obteniendo la hora de estas tres zonas horarias para observar las diferencias:
import datetime
import zoneinfo
# creamos las zonas horarias
zona_madrid = zoneinfo.ZoneInfo("Europe/Madrid")
zona_chihuahua = zoneinfo.ZoneInfo("America/Chihuahua")
zona_bogota = zoneinfo.ZoneInfo("America/Bogota")
# obtenemos las horas en cada zona horaria
hora_madrid = datetime.datetime.now(zona_madrid)
hora_chihuahua = datetime.datetime.now(zona_chihuahua)
hora_bogota = datetime.datetime.now(zona_bogota)
# mostramos las horas obtenidas
print(f'Madrid: {hora_madrid}')
print(f'Chihuahua: {hora_chihuahua}')
print(f'Bogota: {hora_bogota}')
Resultado:
Madrid: 2022-10-24 11:15:04.571768+02:00 Chihuahua: 2022-10-24 03:15:04.571774-06:00 Bogota: 2022-10-24 04:15:04.571775-05:00
Obtener fecha y hora actuales de un servidor NTP en Python
El protocolo NTP (Network Time Protocol) nos permite sincronizar la hora de manera muy precisa entre diversos dispositivos de una red. Es por eso que podemos utilizarlo para obtener el momento actual de manera precisa y no tener que fiarnos de la del sistema (aunque los sistemas operativos modernos suelen sincronizarse con un servidor NTP).
Puedes obtener más información sobre el protocolo NTP y cómo utilizarlo en el proyecto NTP Pool Project, que es un conjunto de servidores que se pueden usar de manera segura, rápida y fiable.
En Python podemos utilizar la librería ntplib
para hacer la consulta a un servidor.
Recuerda instalar la librería. Puedes utilizar para ello el comando pip install ntplib
.
Esta librería implementa un cliente de NTP que nos hace sencillo comunicarnos un servidor de tiempo. Crearemos una instancia de la clase NTPClient
y después realizaremos una petición con el método request
a un servidor o a un pool de servidores. En este caso usaremos el pool general pool.ntp.org
, que intentará asignarnos el mejor servidor para nuestra ubicación, pero puedes seleccionar el que necesites de esta lista.
Encapsulamos este código en un bloque try except
ya que la conexión podría fallar. Si todo va bien, request
nos devolverá un objeto respuesta
con distinta información. El atributo que nos interesa de dicho objeto es tx_time
, que contiene la hora actual en formato de sistema.
Solo nos queda traducir esa hora a un objeto datetime
. Podemos hacer uso de la función fromtimestamp
de la clase datetime
que la convertirá a un objeto datetime
en la zona horaria de nuestro sistema.
Si lo deseamos, podemos proporcionar a dicha función un zona horaria diferente de la nuestra (leer sección anterior) a través del parámetro tz
.
Veamos el código para obtener la hora actual a través de NTP:
import datetime
import ntplib
try:
servidor_ntp = 'pool.ntp.org'
c = ntplib.NTPClient()
respuesta = c.request(servidor_ntp)
fecha_actual = datetime.datetime.fromtimestamp(respuesta.tx_time)
print(fecha_actual)
except:
print(f'Error de conexión a {servidor_ntp}')
Y el resultado será:
2022-10-24 10:23:09.736467
Ahora, con todo lo aprendido en secciones anteriores podrás acceder a los componentes de fecha y de hora o formatear el resultado a tu gusto.
Conclusiones
Hemos visto cómo obtener la hora actual del sistema, de un servidor de NTP y en cualquier zona horaria.
Hemos aprendido a formatear la hora a nuestro gusto.
Día que estás fuera, consejo sobre Python que te pierdes.
Antes de suscribirte consulta aquí la
Finalidad de recogida y tratamiento de datos personales: enviarte boletín informativo de Python y comunicaciones comerciales.
Legitimación: tu consentimiento.
Destinatarios: no se ceden a terceros. Los datos se almacenan en los servidores de marketing (GetResponse).
Derechos: podrás ejercer tus derechos de acceso, rectificación, limitación y supresión de datos en info @ codigopiton.com así como presentar una reclamación ante una autoridad de control.
Más información: política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal.
Como en muchas aplicaciones no se puede independizar de la fecha, también te he contado cómo obtener y formatear la fecha, por si fuera necesario.
Ten en cuenta que, en general, el manejo de fechas y horas es un tema bastante complicado porque muchas veces las horas responden a temas de políticas de los países y no hay un criterio común. Además, hay que tener en cuenta que en muchas lugares se aplican ajustes horarios para la optimización del uso de la luz solar. Todo eso puede hacer que tengas que adaptar tu programa en función del país en el que tenga que funcionar.
Y nada más, si te ha resultado de ayuda este artículo considera suscribirte a Código Pitón y recibirás trucos y consejos de Python de vez en cuando así como algún regalito en cuanto te suscribas.
¡Feliz programación!
Te envío todos los días un consejo para que cada día seas mejor en Python.
Siempre sobre Python y programación.
Más de 2500 personas como tú los reciben cada día.
Día que estás fuera, consejo sobre Python que te pierdes.
Antes de suscribirte consulta aquí la
Finalidad de recogida y tratamiento de datos personales: enviarte boletín informativo de Python y comunicaciones comerciales.
Legitimación: tu consentimiento.
Destinatarios: no se ceden a terceros. Los datos se almacenan en los servidores de marketing (GetResponse).
Derechos: podrás ejercer tus derechos de acceso, rectificación, limitación y supresión de datos en info @ codigopiton.com así como presentar una reclamación ante una autoridad de control.
Más información: política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal.