Julia Fecha y Hora

Julia, a través del módulo Dates, proporciona las siguientes tres funciones para manejar fechas y horas:

  • Date: representa la fecha, con precisión de día, solo muestra la fecha.
  • DateTime: representa la fecha y la hora, con precisión de milisegundos.
  • DateTime: representa la hora del día, con precisión de nanosegundos, representa un momento específico dentro de las 24 horas del día.

Antes de usarlo, primero debemos importar el módulo Dates:

import Dates

Los tipos Date y DateTime pueden analizarse mediante enteros o tipos Period.

Period se basa en valores de fecha y representa años, meses, días, etc.:

Period
Year
Quarter
Month
Week
Day
Hour
Minute
Second
Millisecond
Microsecond
Nanosecond

Date y DateTime son subtipos del tipo abstracto TimeType.

La siguiente figura muestra la relación entre los tipos de fecha. Haz clic en la imagen para ampliarla:

Mostrar el tiempo de la fecha:

Ejemplo

julia> import Dates

julia> rightnow = Dates.Time(Dates.now()) # Hora
08:41:15.917

julia> theday = Dates.Date(2022,5,6) # Fecha
2022-05-06

julia> today_date = Dates.today()
2022-05-11

julia> Dates.now(Dates.UTC)
2022-05-11T00:44:20.136

# Formatear hora
julia> Dates.DateTime("20220429 120000", "yyyymmdd HHMMSS")
2022-04-29T12:00:00


julia> Dates.DateTime("19/04/2022 17:42", "dd/mm/yyyy HH:MM")
2022-04-19T17:42:00

La siguiente tabla muestra los códigos de formato de fecha, mediante los cuales podemos formatear nuestras fechas:

Carácter Elemento de fecha/hora
Y Representa el año, por ejemplo: yyyy => 1984, yy => 84
m Representa el mes, por ejemplo: m => 7 o 07
u Representa el nombre abreviado del mes, por ejemplo: Jun
U Representa el nombre completo del mes, por ejemplo: January
e Representa el día de la semana abreviado, por ejemplo: Mon
E Representa el día de la semana completo, por ejemplo: Monday
d Representa el día, por ejemplo: 1 o 01
H Representa la hora, por ejemplo: HH => 00
M Representa el minuto, por ejemplo: MM => 00
S Representa el segundo, por ejemplo: S => 00
s Representa el milisegundo, por ejemplo: .000

Ejemplo

julia> Dates.Date("Sun, 27 Sep 2022", "e, d u y")
2022-09-27

julia> Dates.DateTime("Sun, 27 Sep 2022 10:25:10", "e, d u y H:M:S")
2022-09-27T10:25:10

Mediante los ejemplos anteriores hemos creado algunos objetos de fecha y hora. A continuación podemos utilizar estos objetos para obtener datos (incluyendo año, mes, día, minuto, segundo, hora, etc.):

Ejemplo

julia> theday = Dates.Date(2022,5,6) # Crear objeto de fecha
2022-05-06

# A continuación, obtener los datos de theday
julia> Dates.year(theday)
2022

julia> Dates.month(theday)
5

# Obtener los datos de la hora actual
julia> rightnow = Dates.now()
2022-05-11T08:51:45.342

julia> Dates.minute(rightnow)
51

julia> Dates.hour(rightnow)
8

julia> Dates.second(rightnow)
45

# Obtener el mes y el día de la semana
julia> Dates.dayofweek(theday)
5

julia> Dates.dayname(theday)
"Friday"

julia> Dates.yearmonthday(theday)
(2022, 5, 6)

julia> Dates.dayofweekofmonth(theday)
1

Operaciones con fechas

Podemos realizar operaciones aritméticas con objetos de fecha.

Por ejemplo, calcular cuántos días difieren dos fechas:

Ejemplo

julia> day1 = Dates.Date(2022,1,17)
2022-01-17

julia> day2 = Dates.Date(2022,3,23)
2022-03-23

julia> day2 - day1
65 days

# Usar diferentes unidades de tiempo
julia> Dates.canonicalize(Dates.CompoundPeriod(day2 - day1))
9 weeks, 2 days

También podemos sumar fechas, por ejemplo, calcular la fecha después de 2 años y 6 meses:

Ejemplo

julia> rightnow = Dates.now()
2022-05-11T09:01:07.946

julia> rightnow + Dates.Year(20) + Dates.Month(6)
2042-11-11T09:01:07.946

# Fecha después de 6 días
julia> rightnow + Dates.Day(6)
2022-05-17T09:01:07.946

Rango de fechas

Julia puede crear fechas en un intervalo especificado mediante objetos iterables range (rango). En el siguiente ejemplo, crearemos un iterador que genera el primer día de cada mes.

Ejemplo

date_range = Dates.Date(2011,1,1):Dates.Month(1):Dates.Date(2022,1,1)
Dates.Date("2011-01-01"):Dates.Month(1):Dates.Date("2022-01-01")

En el objeto de rango anterior, podemos averiguar cuáles son días laborables. Para ello, debemos crear una función anónima para filter(), que determinará si un día es laborable según la fecha dada:

Ejemplo

julia> weekdaysfromrange = filter(dy -> Dates.dayname(dy) != "Saturday" && Dates.dayname(dy) != "Sunday" , date_range)
94-element Vector{Dates.Date}:
 2011-02-01
 2011-03-01
 2011-04-01
 2011-06-01
 2011-07-01
 2011-08-01
 2011-09-01
 2011-11-01
 2011-12-01
 2012-02-01
 ⋮
 2021-02-01
 2021-03-01
 2021-04-01
 2021-06-01
 2021-07-01
 2021-09-01
 2021-10-01
 2021-11-01
 2021-12-01

Redondear fecha y hora

Usualmente usamos las funciones round(), floor() y ceil() para redondear argumentos hacia arriba o hacia abajo. Asimismo, estas funciones pueden usarse para redondear fechas, a fin de ajustar la fecha hacia adelante o hacia atrás.

Ejemplo

julia> Dates.now()
2022-05-11T09:17:49.824

julia> Dates.format(round(Dates.DateTime(Dates.now()), Dates.Minute(15)), Dates.RFC1123Format)
"Wed, 11 May 2022 09:15:00"

ceil()La función ajustará la fecha/hora hacia adelante, como se muestra a continuación:

Ejemplo

julia> theday = Dates.Date(2022,5,6)
2022-05-06

# El próximo mes
julia> ceil(theday, Dates.Month)
2022-06-01

# El próximo año
julia> ceil(theday, Dates.Year)
2023-01-01

# La próxima semana
julia> ceil(theday, Dates.Week)
2022-05-09

Fechas recurrentes

Podemos buscar fechas recurrentes dentro de un rango, por ejemplo, todos los domingos:

Ejemplo

# Crear fechas de rango
julia> date_range = Dates.Date(2011,1,1):Dates.Month(1):Dates.Date(2022,1,1)
Dates.Date("2011-01-01"):Dates.Month(1):Dates.Date("2022-01-01")
# Usar la función filter() para filtrar todos los domingos
julia> filter(d -> Dates.dayname(d) == "Sunday", date_range)
20-element Vector{Dates.Date}:
 2011-05-01
 2012-01-01
 2012-04-01
 2012-07-01
 2013-09-01
 2013-12-01
 2014-06-01
 2015-02-01
 2015-03-01
 2015-11-01
 2016-05-01
 2017-01-01
 2017-10-01
 2018-04-01
 2018-07-01
 2019-09-01
 2019-12-01
 2020-03-01
 2020-11-01
 2021-08-01
Tiempo Unix

El tiempo UNIX, también llamado tiempo POSIX, es una representación del tiempo utilizada por sistemas UNIX o similares a UNIX: el número total de segundos transcurridos desde el 1 de enero de 1970 a las 00:00:00 UTC hasta el presente, sin considerar los segundos intercalares.

La función time() devuelve el valor Unix:

Ejemplo

julia> time()
1.652232489777e9

La función unix2datetime() convierte el tiempo Unix en un objeto de fecha/hora:

Ejemplo

julia> Dates.unix2datetime(time())
2022-05-11T01:28:23.493

Momento actual

DateTimes están expresados en milisegundos. Podemos usar la función Dates.value para obtener el tiempo en milisegundos:

Ejemplo

julia> moment=Dates.now()
2022-05-11T09:31:31.037

julia> Dates.value(moment)
63787944691037

julia> moment.instant
Dates.UTInstant{Millisecond}(Millisecond(63787944691037))

Tiempo y monitoreo

Julia nos proporciona@elapsedmacro, que devolverá el tiempo (en segundos) necesario para ejecutar una expresión.

Calcula el tiempo necesario para ejecutar el siguiente código:

Ejemplo

julia> function foo(n)
         for i in 1:n
           x = sin(rand())
         end
       end
foo (generic function with 1 method)


julia> @elapsed foo(100000000)
1.360567967

julia> @time foo(100000000)
  1.363258 seconds

Más ejemplos

Ejemplo

julia> DateTime(2013)
2013-01-01T00:00:00

julia> DateTime(2013,7)
2013-07-01T00:00:00

julia> DateTime(2013,7,1)
2013-07-01T00:00:00

julia> DateTime(2013,7,1,12)
2013-07-01T12:00:00

julia> DateTime(2013,7,1,12,30)
2013-07-01T12:30:00

julia> DateTime(2013,7,1,12,30,59)
2013-07-01T12:30:59

julia> DateTime(2013,7,1,12,30,59,1)
2013-07-01T12:30:59.001

julia> Date(2013)
2013-01-01

julia> Date(2013,7)
2013-07-01

julia> Date(2013,7,1)
2013-07-01

julia> Date(Dates.Year(2013),Dates.Month(7),Dates.Day(1))
2013-07-01

julia> Date(Dates.Month(7),Dates.Year(2013))
2013-07-01
Otras extensiones