Saltar al contenido

Cómo Obtener la Hora Actual en Python

Cómo obtener la hora actual en Python Header

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:

15 conceptos fundamentales que necesitas conocer para aprender y dominar Python

Te voy a hacer dos regalos (no uno, sino dos) que hablan de estos 15 conceptos fundamentales de Python: mi Tutorial Básico Interactivo de Python y una cheat sheet de Python en español: La Hoja de Referencia de Python.

Estos regalos son exclusivos para los suscriptores de Código Pitón.

👍 Quiero mis dos regalos

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 formatoDescripciónAplicado a 18:05:45
%HHora en formato 24h
con ceros a la izquierda
18
%-HHora en formato 24h18
%IHora en formato 12h
con ceros a la izquierda
06
%-IHora en formato 12h6
%pAM o PMPM
%MMinuto
con ceros a la izquierda
05
%-MMinuto5
%SSegundo
con ceros a la izquierda
45
%-SSegundo45
%fMicrosegundos
con ceros a la izquierda
000000
Códigos de formato de horas

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 formatoDescripciónAplicado a 15/07/2019
%aNombre del día de la semana
abreviado
lun
%ANombre del día de la semanalunes
%wNúmero de día de la semana
(0 domingo – 6 sábado)
1
%dDía del mes
con ceros a la izquierda
15
%-dDía del mes15
%bNombre del mes abreviadojul
%BNombre del mesjulio
%mDía del mes
con ceros a la izquierda
07
%-mDía del mes7
%yAño sin el siglo
con ceros a la izquierda
19
%YAño con el siglo2019
%jDía del año
con ceros a la izquierda
196
%-jDía del año196
%USemana del año
(domingo primer día)
con ceros a la izquierda
28
%WSemana del año
(lunes primer día)
con ceros a la izquierda
28
Códigos de formato de fechas

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.

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.

Recibe contenido exclusivo y obtén gratis la Hoja de Referencia de Python.

Antes de suscribirte consulta aquí la 
Información Básica sobre Protección de Datos. Responsable de datos: Juan Monroy Camafreita. 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 (MailRelay). 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!

 🎁 Tutorial Básico Interactivo y La Hoja de Referencia de Python – ¡Gratis!

La Hoja de Referencia de Python - Código Pitón
¿Quieres mejorar tu Python? Recibe totalmente gratis el Tutorial Básico Interactivo de Python, la Hoja de Referencia de Python y contenido exclusivo como trucos y consejos.



Antes de suscribirte consulta aquí la Información Básica sobre Protección de Datos. Responsable de los datos: Juan Monroy Camafreita. Finalidad de la recogida y tratamiento de los 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 (MailRelay). 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 en nuestra política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal, incluida información sobre acceso, conservación, rectificación, eliminación, seguridad y otros temas.