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> 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
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
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
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
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
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
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
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
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
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
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
1.652232489777e9
La función unix2datetime() convierte el tiempo Unix en un objeto de fecha/hora:
Ejemplo
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
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
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
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
