Dates
El módulo Dates
proporciona dos tipos para trabajar con fechas: Date
y DateTime
, que representan precisión de días y milisegundos, respectivamente; ambos son subtipos del abstracto TimeType
. La motivación para tener tipos distintos es simple: algunas operaciones son mucho más simples, tanto en términos de código como de razonamiento mental, cuando no se tienen que lidiar con las complejidades de una mayor precisión. Por ejemplo, dado que el tipo 4d61726b646f776e2e436f64652822222c2022446174652229_40726566
solo se resuelve a la precisión de una sola fecha (es decir, sin horas, minutos o segundos), las consideraciones normales para zonas horarias, horario de verano y segundos intercalares son innecesarias y se evitan.
Tanto Date
como DateTime
son básicamente envoltorios inmutables Int64
. El único campo instant
de cualquiera de los tipos es en realidad un tipo UTInstant{P}
, que representa una línea de tiempo de máquina en continuo aumento basada en el segundo UT [1]. El tipo 4d61726b646f776e2e436f64652822222c20224461746554696d652229_40726566
no es consciente de las zonas horarias (naive, en la jerga de Python), análogo a un LocalDateTime en Java 8. Se puede agregar funcionalidad adicional de zona horaria a través de TimeZones.jl package, que compila el IANA time zone database. Tanto 4d61726b646f776e2e436f64652822222c2022446174652229_40726566
como 4d61726b646f776e2e436f64652822222c20224461746554696d652229_40726566
se basan en el estándar ISO 8601, que sigue el calendario gregoriano proleptico. Una nota es que el estándar ISO 8601 es particular sobre las fechas AC/ERA. En general, el último día de la era AC/ERA, 31-12-1 AC/ERA, fue seguido por 1-1-1 DC/CE, por lo que no existe el año cero. Sin embargo, el estándar ISO establece que 1 AC/ERA es el año cero, por lo que 0000-12-31
es el día anterior a 0001-01-01
, y el año -0001
(sí, menos uno para el año) es 2 AC/ERA, el año -0002
es 3 AC/ERA, etc.
Constructors
Date
y DateTime
tipos pueden ser construidos por tipos enteros o Period
, mediante análisis, o a través de ajustadores (más sobre eso más adelante):
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
Date
o DateTime
el análisis se logra mediante el uso de cadenas de formato. Las cadenas de formato funcionan con la noción de definir "espacios" delimitados o de ancho fijo que contienen un período para analizar y pasar el texto a analizar y la cadena de formato a un 4d61726b646f776e2e436f64652822222c2022446174652229_40726566
o 4d61726b646f776e2e436f64652822222c20224461746554696d652229_40726566
constructor, de la forma Date("2015-01-01",dateformat"y-m-d")
o DateTime("20150101",dateformat"yyyymmdd")
.
Los espacios delimitados se marcan especificando el delimitador que el analizador debe esperar entre dos períodos subsiguientes; así que "y-m-d"
le indica al analizador que entre el primer y el segundo espacio en una cadena de fecha como "2014-07-16"
, debe encontrar el carácter -
. Los caracteres y
, m
y d
le indican al analizador qué períodos analizar en cada espacio.
Como en el caso de los constructores anteriores, como Date(2013)
, los DateFormat
delimitados permiten partes faltantes de fechas y horas siempre que las partes anteriores estén dadas. Las otras partes reciben los valores predeterminados habituales. Por ejemplo, Date("1981-03", dateformat"y-m-d")
devuelve 1981-03-01
, mientras que Date("31/12", dateformat"d/m/y")
da 0001-12-31
. (Tenga en cuenta que el año predeterminado es 1 d.C./E.C.) Sin embargo, una cadena vacía siempre lanza un ArgumentError
.
Los espacios de ancho fijo se especifican repitiendo el carácter de punto el número de veces correspondiente al ancho sin delimitador entre caracteres. Así que dateformat"yyyymmdd"
correspondería a una cadena de fecha como "20140716"
. El analizador distingue un espacio de ancho fijo por la ausencia de un delimitador, notando la transición "yyyymm"
de un carácter de punto al siguiente.
El soporte para el análisis de meses en formato de texto también se admite a través de los caracteres u
y U
, para nombres de meses abreviados y de longitud completa, respectivamente. Por defecto, solo se admiten nombres de meses en inglés, por lo que u
corresponde a "Ene", "Feb", "Mar", etc. Y U
corresponde a "Enero", "Febrero", "Marzo", etc. Similar a otras funciones de mapeo nombre=>valor dayname
y monthname
, se pueden cargar locales personalizadas pasando el mapeo locale=>Dict{String,Int}
a los diccionarios MONTHTOVALUEABBR
y MONTHTOVALUE
para nombres de meses abreviados y de nombre completo, respectivamente.
Los ejemplos anteriores utilizaron el macro de cadena dateformat""
. Este macro crea un objeto DateFormat
una vez cuando se expande el macro y utiliza el mismo objeto DateFormat
incluso si un fragmento de código se ejecuta varias veces.
julia> for i = 1:10^5
Date("2015-01-01", dateformat"y-m-d")
end
O puedes crear el objeto DateFormat explícitamente:
julia> df = DateFormat("y-m-d");
julia> dt = Date("2015-01-01",df)
2015-01-01
julia> dt2 = Date("2015-01-02",df)
2015-01-02
Alternativamente, usa la difusión:
julia> years = ["2015", "2016"];
julia> Date.(years, DateFormat("yyyy"))
2-element Vector{Date}:
2015-01-01
2016-01-01
Para conveniencia, puedes pasar la cadena de formato directamente (por ejemplo, Date("2015-01-01","y-m-d")
), aunque esta forma incurre en costos de rendimiento si estás analizando el mismo formato repetidamente, ya que internamente crea un nuevo objeto DateFormat
cada vez.
Además de los constructores, un Date
o DateTime
se puede construir a partir de cadenas utilizando las funciones parse
y tryparse
, pero con un tercer argumento opcional de tipo DateFormat
que especifica el formato; por ejemplo, parse(Date, "06.23.2013", dateformat"m.d.y")
, o tryparse(DateTime, "1999-12-31T23:59:59")
que utiliza el formato predeterminado. La diferencia notable entre las funciones es que con 4d61726b646f776e2e436f64652822222c202274727970617273652229_40726566
, no se lanza un error si la cadena está vacía o en un formato inválido; en su lugar, se devuelve nothing
.
Antes de Julia 1.9, las cadenas vacías podían ser pasadas a constructores y parse
sin error, devolviendo como corresponde DateTime(1)
, Date(1)
o Time(0)
. Del mismo modo, tryparse
no devolvía nothing
.
Un conjunto completo de pruebas y ejemplos de análisis y formato está disponible en stdlib/Dates/test/io.jl
.
Durations/Comparisons
Encontrar la duración entre dos Date
o DateTime
es sencillo dado su representación subyacente como UTInstant{Day}
y UTInstant{Millisecond}
, respectivamente. La diferencia entre 4d61726b646f776e2e436f64652822222c2022446174652229_40726566
se devuelve en el número de Day
, y 4d61726b646f776e2e436f64652822222c20224461746554696d652229_40726566
en el número de Millisecond
. De manera similar, comparar TimeType
es un simple asunto de comparar los instantes de máquina subyacentes (que a su vez compara los valores internos Int64
).
julia> dt = Date(2012,2,29)
2012-02-29
julia> dt2 = Date(2000,2,1)
2000-02-01
julia> dump(dt)
Date
instant: Dates.UTInstant{Day}
periods: Day
value: Int64 734562
julia> dump(dt2)
Date
instant: Dates.UTInstant{Day}
periods: Day
value: Int64 730151
julia> dt > dt2
true
julia> dt != dt2
true
julia> dt + dt2
ERROR: MethodError: no method matching +(::Date, ::Date)
[...]
julia> dt * dt2
ERROR: MethodError: no method matching *(::Date, ::Date)
[...]
julia> dt / dt2
ERROR: MethodError: no method matching /(::Date, ::Date)
julia> dt - dt2
4411 days
julia> dt2 - dt
-4411 days
julia> dt = DateTime(2012,2,29)
2012-02-29T00:00:00
julia> dt2 = DateTime(2000,2,1)
2000-02-01T00:00:00
julia> dt - dt2
381110400000 milliseconds
Accessor Functions
Debido a que los tipos Date
y DateTime
se almacenan como valores únicos Int64
, las partes o campos de la fecha se pueden recuperar a través de funciones de acceso. Los accesores en minúsculas devuelven el campo como un entero:
julia> t = Date(2014, 1, 31)
2014-01-31
julia> Dates.year(t)
2014
julia> Dates.month(t)
1
julia> Dates.week(t)
5
julia> Dates.day(t)
31
While propercase return the same value in the corresponding Period
type:
julia> Dates.Year(t)
2014 years
julia> Dates.Day(t)
31 days
Se proporcionan métodos compuestos porque es más eficiente acceder a múltiples campos al mismo tiempo que de forma individual:
julia> Dates.yearmonth(t)
(2014, 1)
julia> Dates.monthday(t)
(1, 31)
julia> Dates.yearmonthday(t)
(2014, 1, 31)
También se puede acceder al UTInstant
subyacente o al valor entero:
julia> dump(t)
Date
instant: Dates.UTInstant{Day}
periods: Day
value: Int64 735264
julia> t.instant
Dates.UTInstant{Day}(Day(735264))
julia> Dates.value(t)
735264
Query Functions
Las funciones de consulta proporcionan información calendárica sobre un TimeType
. Incluyen información sobre el día de la semana:
julia> t = Date(2014, 1, 31)
2014-01-31
julia> Dates.dayofweek(t)
5
julia> Dates.dayname(t)
"Friday"
julia> Dates.dayofweekofmonth(t) # 5th Friday of January
5
Mes del año:
julia> Dates.monthname(t)
"January"
julia> Dates.daysinmonth(t)
31
Así como información sobre el año y el trimestre de TimeType
:
julia> Dates.isleapyear(t)
false
julia> Dates.dayofyear(t)
31
julia> Dates.quarterofyear(t)
1
julia> Dates.dayofquarter(t)
31
Los métodos dayname
y monthname
también pueden tomar una palabra clave opcional locale
que se puede usar para devolver el nombre del día o del mes del año para otros idiomas/locales. También hay versiones de estas funciones que devuelven los nombres abreviados, a saber, dayabbr
y monthabbr
. Primero, el mapeo se carga en la variable LOCALES
:
julia> french_months = ["janvier", "février", "mars", "avril", "mai", "juin",
"juillet", "août", "septembre", "octobre", "novembre", "décembre"];
julia> french_months_abbrev = ["janv","févr","mars","avril","mai","juin",
"juil","août","sept","oct","nov","déc"];
julia> french_days = ["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"];
julia> Dates.LOCALES["french"] = Dates.DateLocale(french_months, french_months_abbrev, french_days, [""]);
Las funciones mencionadas anteriormente se pueden utilizar para realizar las consultas:
julia> Dates.dayname(t;locale="french")
"vendredi"
julia> Dates.monthname(t;locale="french")
"janvier"
julia> Dates.monthabbr(t;locale="french")
"janv"
Dado que las versiones abreviadas de los días no están cargadas, intentar usar la función dayabbr
generará un error.
julia> Dates.dayabbr(t;locale="french")
ERROR: BoundsError: attempt to access 1-element Vector{String} at index [5]
Stacktrace:
[...]
TimeType-Period Arithmetic
Es una buena práctica, al usar cualquier lenguaje/framework de fechas, estar familiarizado con cómo se maneja la aritmética de períodos de fechas, ya que hay algunos tricky issues con los que lidiar (aunque mucho menos para tipos de precisión diaria).
El enfoque del módulo Dates
intenta seguir el simple principio de cambiar lo menos posible al realizar la aritmética Period
. Este enfoque también se conoce a menudo como aritmética calendárica o lo que probablemente adivinarías si alguien te preguntara la misma operación en una conversación. ¿Por qué tanto alboroto sobre esto? Tomemos un ejemplo clásico: añade 1 mes al 31 de enero de 2014. ¿Cuál es la respuesta? Javascript dirá March 3 (asume 31 días). PHP dice March 2 (asume 30 días). El hecho es que no hay una respuesta correcta. En el módulo Dates
, da como resultado el 28 de febrero. ¿Cómo lo determina? Considera el clásico juego de apuestas 7-7-7 en los casinos.
Ahora solo imagina que en lugar de 7-7-7, las ranuras son Año-Mes-Día, o en nuestro ejemplo, 2014-01-31. Cuando pides agregar 1 mes a esta fecha, la ranura del mes se incrementa, así que ahora tenemos 2014-02-31. Luego se verifica si el número del día es mayor que el último día válido del nuevo mes; si lo es (como en el caso anterior), el número del día se ajusta hacia abajo al último día válido (28). ¿Cuáles son las ramificaciones de este enfoque? Adelante, agrega otro mes a nuestra fecha, 2014-02-28 + Month(1) == 2014-03-28
. ¿Qué? ¿Esperabas el último día de marzo? No, lo siento, recuerda las ranuras 7-7-7. Se van a cambiar la menor cantidad de ranuras posible, así que primero incrementamos la ranura del mes en 1, 2014-03-28, y listo, hemos terminado porque es una fecha válida. Por otro lado, si tuviéramos que agregar 2 meses a nuestra fecha original, 2014-01-31, entonces terminamos con 2014-03-31, como se esperaba. La otra ramificación de este enfoque es una pérdida de asociatividad cuando se fuerza un orden específico (es decir, agregar cosas en diferentes órdenes resulta en diferentes resultados). Por ejemplo:
julia> (Date(2014,1,29)+Dates.Day(1)) + Dates.Month(1)
2014-02-28
julia> (Date(2014,1,29)+Dates.Month(1)) + Dates.Day(1)
2014-03-01
¿Qué está pasando allí? En la primera línea, estamos sumando 1 día al 29 de enero, lo que resulta en 2014-01-30; luego añadimos 1 mes, así que obtenemos 2014-02-30, que luego se ajusta a 2014-02-28. En el segundo ejemplo, primero añadimos 1 mes, donde obtenemos 2014-02-29, que se ajusta a 2014-02-28, y luego añadimos 1 día, lo que resulta en 2014-03-01. Un principio de diseño que ayuda en este caso es que, en presencia de múltiples Períodos, las operaciones se ordenarán por los tipos de los Períodos, no por su valor o orden posicional; esto significa que Año
siempre se añadirá primero, luego Mes
, luego Semana
, etc. Por lo tanto, lo siguiente sí resulta en asociatividad y funciona perfectamente:
julia> Date(2014,1,29) + Dates.Day(1) + Dates.Month(1)
2014-03-01
julia> Date(2014,1,29) + Dates.Month(1) + Dates.Day(1)
2014-03-01
¿Complicado? Quizás. ¿Qué debe hacer un usuario inocente de Dates
? La conclusión es estar consciente de que forzar explícitamente una cierta asociatividad, al tratar con meses, puede llevar a algunos resultados inesperados, pero de lo contrario, todo debería funcionar como se espera. Afortunadamente, esa es prácticamente la extensión de los casos extraños en la aritmética de períodos de fecha al tratar con el tiempo en UT (evitando las "alegrías" de lidiar con el horario de verano, segundos intercalares, etc.).
Como bonificación, todos los objetos de aritmética de períodos funcionan directamente con rangos:
julia> dr = Date(2014,1,29):Day(1):Date(2014,2,3)
Date("2014-01-29"):Day(1):Date("2014-02-03")
julia> collect(dr)
6-element Vector{Date}:
2014-01-29
2014-01-30
2014-01-31
2014-02-01
2014-02-02
2014-02-03
julia> dr = Date(2014,1,29):Dates.Month(1):Date(2014,07,29)
Date("2014-01-29"):Month(1):Date("2014-07-29")
julia> collect(dr)
7-element Vector{Date}:
2014-01-29
2014-02-28
2014-03-29
2014-04-29
2014-05-29
2014-06-29
2014-07-29
Adjuster Functions
Tan conveniente como es la aritmética de períodos de fechas, a menudo los tipos de cálculos necesarios sobre fechas adquieren una naturaleza calendárica o temporal en lugar de un número fijo de períodos. Los días festivos son un ejemplo perfecto; la mayoría sigue reglas como "Día de los Caídos = Último lunes de mayo", o "Acción de Gracias = 4º jueves de noviembre". Este tipo de expresiones temporales tratan con reglas relativas al calendario, como el primero o el último del mes, el próximo martes, o los primeros y terceros miércoles, etc.
El módulo Dates
proporciona la API de ajustador a través de varios métodos convenientes que ayudan a expresar de manera simple y sucinta las reglas temporales. El primer grupo de métodos de ajustador se ocupa del primero y el último de semanas, meses, trimestres y años. Cada uno toma un único TimeType
como entrada y devuelve o ajusta a el primero o el último del período deseado en relación con la entrada.
julia> Dates.firstdayofweek(Date(2014,7,16)) # Adjusts the input to the Monday of the input's week
2014-07-14
julia> Dates.lastdayofmonth(Date(2014,7,16)) # Adjusts to the last day of the input's month
2014-07-31
julia> Dates.lastdayofquarter(Date(2014,7,16)) # Adjusts to the last day of the input's quarter
2014-09-30
Los siguientes dos métodos de orden superior, tonext
, y toprev
, generalizan el trabajo con expresiones temporales al tomar un DateFunction
como primer argumento, junto con un TimeType
inicial. Un DateFunction
es simplemente una función, generalmente anónima, que toma un solo 4d61726b646f776e2e436f64652822222c202254696d65547970652229_40726566
como entrada y devuelve un Bool
, true
indicando un criterio de ajuste satisfecho. Por ejemplo:
julia> istuesday = x->Dates.dayofweek(x) == Dates.Tuesday; # Returns true if the day of the week of x is Tuesday
julia> Dates.tonext(istuesday, Date(2014,7,13)) # 2014-07-13 is a Sunday
2014-07-15
julia> Dates.tonext(Date(2014,7,13), Dates.Tuesday) # Convenience method provided for day of the week adjustments
2014-07-15
Esto es útil con la sintaxis de bloque do para expresiones temporales más complejas:
julia> Dates.tonext(Date(2014,7,13)) do x
# Return true on the 4th Thursday of November (Thanksgiving)
Dates.dayofweek(x) == Dates.Thursday &&
Dates.dayofweekofmonth(x) == 4 &&
Dates.month(x) == Dates.November
end
2014-11-27
El método Base.filter
se puede utilizar para obtener todas las fechas/momentos válidos en un rango especificado:
# Pittsburgh street cleaning; Every 2nd Tuesday from April to November
# Date range from January 1st, 2014 to January 1st, 2015
julia> dr = Dates.Date(2014):Day(1):Dates.Date(2015);
julia> filter(dr) do x
Dates.dayofweek(x) == Dates.Tue &&
Dates.April <= Dates.month(x) <= Dates.Nov &&
Dates.dayofweekofmonth(x) == 2
end
8-element Vector{Date}:
2014-04-08
2014-05-13
2014-06-10
2014-07-08
2014-08-12
2014-09-09
2014-10-14
2014-11-11
Ejemplos y pruebas adicionales están disponibles en stdlib/Dates/test/adjusters.jl
.
Period Types
Los períodos son una visión humana de duraciones de tiempo discretas, a veces irregulares. Considera 1 mes; podría representar, en días, un valor de 28, 29, 30 o 31 dependiendo del contexto del año y del mes. O un año podría representar 365 o 366 días en el caso de un año bisiesto. Period
tipos son simples Int64
envoltorios y se construyen envolviendo cualquier tipo convertible a Int64
, es decir, Year(1)
o Month(3.0)
. La aritmética entre 4d61726b646f776e2e436f64652822222c2022506572696f642229_40726566
del mismo tipo se comporta como enteros, y hay disponible una aritmética limitada Period-Real
. Puedes extraer el entero subyacente con Dates.value
.
julia> y1 = Dates.Year(1)
1 year
julia> y2 = Dates.Year(2)
2 years
julia> y3 = Dates.Year(10)
10 years
julia> y1 + y2
3 years
julia> div(y3,y2)
5
julia> y3 - y2
8 years
julia> y3 % y2
0 years
julia> div(y3,3) # mirrors integer division
3 years
julia> Dates.value(Dates.Millisecond(10))
10
Representar períodos o duraciones que no son múltiplos enteros de los tipos básicos se puede lograr con el tipo Dates.CompoundPeriod
. Los períodos compuestos pueden ser construidos manualmente a partir de tipos simples Period
. Además, la función canonicalize
se puede utilizar para descomponer un período en un 4d61726b646f776e2e436f64652822222c202244617465732e436f6d706f756e64506572696f642229_40726566
. Esto es particularmente útil para convertir una duración, por ejemplo, una diferencia de dos DateTime
, en una representación más conveniente.
julia> cp = Dates.CompoundPeriod(Day(1),Minute(1))
1 day, 1 minute
julia> t1 = DateTime(2018,8,8,16,58,00)
2018-08-08T16:58:00
julia> t2 = DateTime(2021,6,23,10,00,00)
2021-06-23T10:00:00
julia> canonicalize(t2-t1) # creates a CompoundPeriod
149 weeks, 6 days, 17 hours, 2 minutes
Rounding
Date
y DateTime
pueden ser redondeados a una resolución especificada (por ejemplo, 1 mes o 15 minutos) con floor
, ceil
, o round
:
julia> floor(Date(1985, 8, 16), Dates.Month)
1985-08-01
julia> ceil(DateTime(2013, 2, 13, 0, 31, 20), Dates.Minute(15))
2013-02-13T00:45:00
julia> round(DateTime(2016, 8, 6, 20, 15), Dates.Day)
2016-08-07T00:00:00
A diferencia del método numérico round
, que rompe empates hacia el número par por defecto, el método TimeType
4d61726b646f776e2e436f64652822222c2022726f756e642229_40726566
utiliza el modo de redondeo RoundNearestTiesUp
. (Es difícil adivinar qué implicaría romper empates hacia el "par" 4d61726b646f776e2e436f64652822222c202254696d65547970652229_40726566
.) Se pueden encontrar más detalles sobre los RoundingMode
disponibles en el API reference.
El redondeo debería comportarse generalmente como se espera, pero hay algunos casos en los que el comportamiento esperado no es obvio.
Rounding Epoch
En muchos casos, la resolución especificada para el redondeo (por ejemplo, Dates.Second(30)
) se divide uniformemente en el siguiente período más grande (en este caso, Dates.Minute(1)
). Pero el comportamiento de redondeo en casos en los que esto no es cierto puede llevar a confusión. ¿Cuál es el resultado esperado de redondear un DateTime
a la hora más cercana de 10 horas?
julia> round(DateTime(2016, 7, 17, 11, 55), Dates.Hour(10))
2016-07-17T12:00:00
Eso puede parecer confuso, dado que la hora (12) no es divisible por 10. La razón por la que se eligió 2016-07-17T12:00:00
es que es 17,676,660 horas después de 0000-01-01T00:00:00
, y 17,676,660 es divisible por 10.
Como los valores de Julia Date
y DateTime
se representan de acuerdo con el estándar ISO 8601, se eligió 0000-01-01T00:00:00
como base (o "época de redondeo") desde la cual comenzar el conteo de días (y milisegundos) utilizados en los cálculos de redondeo. (Nota que esto difiere ligeramente de la representación interna de Julia de 4d61726b646f776e2e436f64652822222c2022446174652229_40726566
usando Rata Die notation; pero dado que el estándar ISO 8601 es más visible para el usuario final, se eligió 0000-01-01T00:00:00
como la época de redondeo en lugar de 0000-12-31T00:00:00
utilizada internamente para minimizar la confusión.)
La única excepción al uso de 0000-01-01T00:00:00
como la época de redondeo es al redondear a semanas. Redondear a la semana más cercana siempre devolverá un lunes (el primer día de la semana según lo especificado por la ISO 8601). Por esta razón, usamos 0000-01-03T00:00:00
(el primer día de la primera semana del año 0000, según lo definido por la ISO 8601) como base al redondear a un número de semanas.
Aquí hay un caso relacionado en el que el comportamiento esperado no es necesariamente obvio: ¿Qué sucede cuando redondeamos al más cercano P(2)
, donde P
es un tipo Period
? En algunos casos (específicamente, cuando P <: Dates.TimePeriod
) la respuesta es clara:
julia> round(DateTime(2016, 7, 17, 8, 55, 30), Dates.Hour(2))
2016-07-17T08:00:00
julia> round(DateTime(2016, 7, 17, 8, 55, 30), Dates.Minute(2))
2016-07-17T08:56:00
Esto parece obvio, porque dos de cada uno de estos períodos aún se divide uniformemente en el siguiente período de orden mayor. Pero en el caso de dos meses (que aún se divide uniformemente en un año), la respuesta puede ser sorprendente:
julia> round(DateTime(2016, 7, 17, 8, 55, 30), Dates.Month(2))
2016-07-01T00:00:00
¿Por qué redondear al primer día de julio, aunque sea el mes 7 (un número impar)? La clave es que los meses están indexados desde 1 (el primer mes se asigna el 1), a diferencia de las horas, minutos, segundos y milisegundos (el primero de los cuales se asigna el 0).
Esto significa que redondear un DateTime
a un múltiplo par de segundos, minutos, horas o años (porque la especificación ISO 8601 incluye un año cero) resultará en un 4d61726b646f776e2e436f64652822222c20224461746554696d652229_40726566
con un valor par en ese campo, mientras que redondear un 4d61726b646f776e2e436f64652822222c20224461746554696d652229_40726566
a un múltiplo par de meses resultará en que el campo de meses tenga un valor impar. Dado que tanto los meses como los años pueden contener un número irregular de días, no está claro si redondear a un número par de días resultará en un valor par en el campo de días.
Consulta el API reference para obtener información adicional sobre los métodos exportados del módulo Dates
.
API reference
Dates and Time Types
Dates.Period
— TypePeríodo
Año
Trimestre
Mes
Semana
Día
Hora
Minuto
Segundo
Milisegundo
Microsegundo
Nanosegundo
Period
types represent discrete, human representations of time.
Dates.CompoundPeriod
— TypeCompoundPeriod
Un CompoundPeriod
es útil para expresar períodos de tiempo que no son un múltiplo fijo de períodos más pequeños. Por ejemplo, "un año y un día" no es un número fijo de días, pero se puede expresar utilizando un CompoundPeriod
. De hecho, un CompoundPeriod
se genera automáticamente mediante la adición de diferentes tipos de períodos, por ejemplo, Year(1) + Day(1)
produce un resultado de CompoundPeriod
.
Dates.Instant
— TypeInstant
Los tipos Instant
representan representaciones de tiempo basadas en enteros, como líneas de tiempo continuas que comienzan desde una época.
Dates.UTInstant
— TypeUTInstant{T}
El UTInstant
representa una línea de tiempo de máquina basada en el tiempo UT (1 día = una revolución de la tierra). El T
es un parámetro Period
que indica la resolución o precisión del instante.
Dates.TimeType
— TypeTimeType
Los tipos TimeType
envuelven instancias de máquina Instant
para proporcionar representaciones humanas del instante de la máquina. Time
, DateTime
y Date
son subtipos de TimeType
.
Dates.DateTime
— TypeDateTime
DateTime
representa un punto en el tiempo según el calendario gregoriano proleptico. La resolución más fina del tiempo es milisegundo (es decir, microsegundos o nanosegundos no pueden ser representados por este tipo). El tipo soporta aritmética de punto fijo, y por lo tanto es propenso a desbordamientos (y subdesbordamientos). Una consecuencia notable es el redondeo al sumar un Microsegundo
o un Nanosegundo
:
julia> dt = DateTime(2023, 8, 19, 17, 45, 32, 900)
2023-08-19T17:45:32.900
julia> dt + Millisecond(1)
2023-08-19T17:45:32.901
julia> dt + Microsecond(1000) # 1000us == 1ms
2023-08-19T17:45:32.901
julia> dt + Microsecond(999) # 999us redondeado a 1000us
2023-08-19T17:45:32.901
julia> dt + Microsecond(1499) # 1499 redondeado a 1000us
2023-08-19T17:45:32.901
Dates.Date
— TypeFecha
Date
envuelve un UTInstant{Day}
e interpreta según el calendario gregoriano proleptico.
Dates.Time
— TypeTiempo
Tiempo
envuelve un Nanosegundo
y representa un momento específico en un día de 24 horas.
Dates.TimeZone
— TypeTimeZone
Zona geográfica generalmente basada en la longitud que determina qué hora es en una ubicación determinada. Algunas zonas horarias observan el horario de verano (por ejemplo, EST -> EDT). Para implementaciones y más soporte, consulte el paquete TimeZones.jl
Dates.UTC
— TypeUTC
UTC
, o Tiempo Universal Coordinado, es la TimeZone
a partir de la cual se miden todas las demás. Está asociado con la hora en 0° de longitud. No se ajusta por el horario de verano.
Dates Functions
Dates.DateTime
— MethodDateTime(y, [m, d, h, mi, s, ms]) -> DateTime
Construye un tipo DateTime
por partes. Los argumentos deben ser convertibles a Int64
.
Dates.DateTime
— MethodDateTime(periods::Period...) -> DateTime
Construye un tipo DateTime
a partir de partes del tipo Period
. Los argumentos pueden estar en cualquier orden. Las partes de DateTime que no se proporcionen se establecerán en el valor de Dates.default(period)
.
Dates.DateTime
— MethodDateTime(f::Function, y[, m, d, h, mi, s]; step=Day(1), limit=10000) -> DateTime
Crea un DateTime
a través de la API de ajustadores. El punto de partida se construirá a partir de los argumentos proporcionados y, m, d...
, y se ajustará hasta que f::Function
devuelva true
. El tamaño del paso en el ajuste se puede proporcionar manualmente a través de la palabra clave step
. limit
proporciona un límite al número máximo de iteraciones que la API de ajuste perseguirá antes de lanzar un error (en el caso de que f::Function
nunca se satisfaga).
Ejemplos
julia> DateTime(dt -> second(dt) == 40, 2010, 10, 20, 10; step = Second(1))
2010-10-20T10:00:40
julia> DateTime(dt -> hour(dt) == 20, 2010, 10, 20, 10; step = Hour(1), limit = 5)
ERROR: ArgumentError: Límite de ajuste alcanzado: 5 iteraciones
Stacktrace:
[...]
Dates.DateTime
— MethodDateTime(dt::Date) -> DateTime
Convierte un Date
a un DateTime
. Se asume que las partes de hora, minuto, segundo y milisegundo del nuevo DateTime
son cero.
Dates.DateTime
— MethodDateTime(dt::AbstractString, format::AbstractString; locale="english") -> DateTime
Construye un DateTime
analizando la cadena de fecha y hora dt
siguiendo el patrón dado en la cadena format
(ver DateFormat
para la sintaxis).
Este método crea un objeto DateFormat
cada vez que se llama. Se recomienda que crees un objeto DateFormat
en su lugar y lo uses como segundo argumento para evitar la pérdida de rendimiento al usar el mismo formato repetidamente.
Ejemplos
julia> DateTime("2020-01-01", "yyyy-mm-dd")
2020-01-01T00:00:00
julia> a = ("2020-01-01", "2020-01-02");
julia> [DateTime(d, dateformat"yyyy-mm-dd") for d ∈ a] # preferido
2-element Vector{DateTime}:
2020-01-01T00:00:00
2020-01-02T00:00:00
Dates.format
— Methodformat(dt::TimeType, format::AbstractString; locale="español") -> AbstractString
Construya una cadena utilizando un objeto TimeType
y aplicando el formato
proporcionado. Los siguientes códigos de caracteres se pueden usar para construir la cadena formato
:
Código | Ejemplos | Comentario |
---|---|---|
y | 6 | Año numérico con un ancho fijo |
Y | 1996 | Año numérico con un ancho mínimo |
m | 1, 12 | Mes numérico con un ancho mínimo |
u | Ene | Nombre del mes abreviado a 3 caracteres según el locale |
U | Enero | Nombre completo del mes según la palabra clave locale |
d | 1, 31 | Día del mes con un ancho mínimo |
H | 0, 23 | Hora (reloj de 24 horas) con un ancho mínimo |
M | 0, 59 | Minuto con un ancho mínimo |
S | 0, 59 | Segundo con un ancho mínimo |
s | 000, 500 | Milisegundo con un ancho mínimo de 3 |
e | Lun, Mar | Días de la semana abreviados |
E | Lunes | Nombre completo del día de la semana |
El número de caracteres de código secuenciales indica el ancho del código. Un formato de yyyy-mm
especifica que el código y
debe tener un ancho de cuatro, mientras que m
un ancho de dos. Los códigos que producen dígitos numéricos tienen un modo asociado: ancho fijo o ancho mínimo. El modo de ancho fijo rellena a la izquierda el valor con ceros cuando es más corto que el ancho especificado y trunca el valor cuando es más largo. El modo de ancho mínimo funciona igual que el ancho fijo, excepto que no trunca los valores más largos que el ancho.
Al crear un formato
, puede usar cualquier carácter que no sea un código como separador. Por ejemplo, para generar la cadena "1996-01-15T00:00:00" podría usar formato
: "yyyy-mm-ddTHH:MM:SS". Tenga en cuenta que si necesita usar un carácter de código como literal, puede usar el carácter de escape barra invertida. La cadena "1996y01m" se puede producir con el formato "yyyy\ymm\m".
Dates.DateFormat
— TypeDateFormat(format::AbstractString, locale="español") -> DateFormat
Construye un objeto de formato de fecha que se puede usar para analizar cadenas de fecha o formatear un objeto de fecha como una cadena. Los siguientes códigos de caracteres se pueden usar para construir la cadena format
:
Código | Coincide | Comentario |
---|---|---|
Y | 1996, 96 | Devuelve el año de 1996, 0096 |
y | 1996, 96 | Igual que Y en parse pero descarta dígitos excesivos en format |
m | 1, 01 | Coincide con meses de 1 o 2 dígitos |
u | Ene | Coincide con meses abreviados según la palabra clave locale |
U | Enero | Coincide con nombres completos de meses según la palabra clave locale |
d | 1, 01 | Coincide con días de 1 o 2 dígitos |
H | 00 | Coincide con horas (reloj de 24 horas) |
I | 00 | Para mostrar horas con reloj de 12 horas |
M | 00 | Coincide con minutos |
S | 00 | Coincide con segundos |
s | .500 | Coincide con milisegundos |
e | Lun, Mar | Coincide con días de la semana abreviados |
E | Lunes | Coincide con nombres completos de días de la semana |
p | AM | Coincide con AM/PM (sin distinción de mayúsculas y minúsculas) |
yyyymmdd | 19960101 | Coincide con año, mes y día de ancho fijo |
Los caracteres no listados arriba se tratan normalmente como delimitadores entre las partes de fecha y hora. Por ejemplo, una cadena dt
de "1996-01-15T00:00:00.0" tendría una cadena format
como "y-m-dTH:M:S.s". Si necesitas usar un carácter de código como delimitador, puedes escaparlo usando una barra invertida. La fecha "1995y01m" tendría el formato "y\ym\m".
Ten en cuenta que 12:00AM corresponde a 00:00 (medianoche), y 12:00PM corresponde a 12:00 (mediodía). Al analizar una hora con un especificador p
, cualquier hora (ya sea H
o I
) se interpreta como un reloj de 12 horas, por lo que el código I
es principalmente útil para la salida.
Crear un objeto DateFormat es costoso. Siempre que sea posible, créalo una vez y úsalo muchas veces o prueba el macro de cadena dateformat""
. Usar este macro crea el objeto DateFormat una vez en el momento de la expansión del macro y lo reutiliza más tarde. También hay varios formateadores predefinidos, que se enumeran más adelante.
Consulta DateTime
y format
para saber cómo usar un objeto DateFormat para analizar y escribir cadenas de fecha respectivamente.
Dates.@dateformat_str
— Macrodateformat"Y-m-d H:M:S"
Crea un objeto DateFormat
. Similar a DateFormat("Y-m-d H:M:S")
pero crea el objeto DateFormat una vez durante la expansión de macros.
Consulta DateFormat
para obtener detalles sobre los especificadores de formato.
Dates.DateTime
— MethodDateTime(dt::AbstractString, df::DateFormat=ISODateTimeFormat) -> DateTime
Construye un DateTime
analizando la cadena de fecha y hora dt
siguiendo el patrón dado en el objeto DateFormat
, o dateformat"yyyy-mm-dd\THH:MM:SS.s" si se omite.
Similar a DateTime(::AbstractString, ::AbstractString)
pero más eficiente al analizar repetidamente cadenas de fecha y hora con un formato similar utilizando un objeto DateFormat
precreado.
Dates.Date
— MethodDate(y, [m, d]) -> Date
Construye un tipo Date
por partes. Los argumentos deben ser convertibles a Int64
.
Dates.Date
— MethodDate(period::Period...) -> Date
Construye un tipo Date
a partir de partes del tipo Period
. Los argumentos pueden estar en cualquier orden. Las partes de Date
que no se proporcionen se establecerán en el valor de Dates.default(period)
.
Dates.Date
— MethodDate(f::Function, y[, m, d]; step=Day(1), limit=10000) -> Date
Crea un Date
a través de la API de ajustadores. El punto de partida se construirá a partir de los argumentos proporcionados y, m, d
, y se ajustará hasta que f::Function
devuelva true
. El tamaño del paso en el ajuste se puede proporcionar manualmente a través de la palabra clave step
. limit
proporciona un límite al número máximo de iteraciones que la API de ajuste perseguirá antes de lanzar un error (dado que f::Function
nunca se satisface).
Ejemplos
julia> Date(date -> week(date) == 20, 2010, 01, 01)
2010-05-17
julia> Date(date -> year(date) == 2010, 2000, 01, 01)
2010-01-01
julia> Date(date -> month(date) == 10, 2000, 01, 01; limit = 5)
ERROR: ArgumentError: Límite de ajuste alcanzado: 5 iteraciones
Stacktrace:
[...]
Dates.Date
— MethodDate(dt::DateTime) -> Date
Convierte un DateTime
a un Date
. Las partes de hora, minuto, segundo y milisegundo del DateTime
se truncan, por lo que solo se utilizan las partes de año, mes y día en la construcción.
Dates.Date
— MethodDate(d::AbstractString, format::AbstractString; locale="english") -> Date
Construye un Date
analizando la cadena de fecha d
siguiendo el patrón dado en la cadena format
(ver DateFormat
para la sintaxis).
Este método crea un objeto DateFormat
cada vez que se llama. Se recomienda que crees un objeto DateFormat
en su lugar y lo uses como el segundo argumento para evitar la pérdida de rendimiento al usar el mismo formato repetidamente.
Ejemplos
julia> Date("2020-01-01", "yyyy-mm-dd")
2020-01-01
julia> a = ("2020-01-01", "2020-01-02");
julia> [Date(d, dateformat"yyyy-mm-dd") for d ∈ a] # preferido
2-element Vector{Date}:
2020-01-01
2020-01-02
Dates.Date
— MethodDate(d::AbstractString, df::DateFormat=ISODateFormat) -> Date
Construye un Date
analizando la cadena de fecha d
siguiendo el patrón dado en el objeto DateFormat
, o dateformat"yyyy-mm-dd" si se omite.
Similar a Date(::AbstractString, ::AbstractString)
pero más eficiente al analizar repetidamente cadenas de fecha con un formato similar con un objeto DateFormat
precreado.
Dates.Time
— MethodTime(h, [mi, s, ms, us, ns]) -> Time
Construye un tipo Time
por partes. Los argumentos deben ser convertibles a Int64
.
Dates.Time
— MethodTime(period::TimePeriod...) -> Time
Construye un tipo Time
a partir de partes del tipo Period
. Los argumentos pueden estar en cualquier orden. Las partes de Time
que no se proporcionen tendrán como valor por defecto el de Dates.default(period)
.
Dates.Time
— MethodTime(f::Function, h, mi=0; step::Period=Second(1), limit::Int=10000)
Time(f::Function, h, mi, s; step::Period=Millisecond(1), limit::Int=10000)
Time(f::Function, h, mi, s, ms; step::Period=Microsecond(1), limit::Int=10000)
Time(f::Function, h, mi, s, ms, us; step::Period=Nanosecond(1), limit::Int=10000)
Crea un Time
a través de la API de ajustador. El punto de partida se construirá a partir de los argumentos proporcionados h, mi, s, ms, us
, y se ajustará hasta que f::Function
devuelva true
. El tamaño del paso en el ajuste se puede proporcionar manualmente a través de la palabra clave step
. limit
proporciona un límite al número máximo de iteraciones que la API de ajuste perseguirá antes de lanzar un error (en el caso de que f::Function
nunca se satisfaga). Tenga en cuenta que el paso predeterminado se ajustará para permitir una mayor precisión para los argumentos dados; es decir, si se proporcionan argumentos de hora, minuto y segundo, el paso predeterminado será Millisecond(1)
en lugar de Second(1)
.
Ejemplos
julia> Time(t -> minute(t) == 30, 20)
20:30:00
julia> Time(t -> minute(t) == 0, 20)
20:00:00
julia> Time(t -> hour(t) == 10, 3; limit = 5)
ERROR: ArgumentError: Límite de ajuste alcanzado: 5 iteraciones
Stacktrace:
[...]
Dates.Time
— MethodTime(dt::DateTime) -> Time
Convierte un DateTime
a un Time
. Las partes de hora, minuto, segundo y milisegundo del DateTime
se utilizan para crear el nuevo Time
. Los microsegundos y nanosegundos son cero por defecto.
Dates.Time
— MethodTime(t::AbstractString, format::AbstractString; locale="english") -> Time
Construye un Time
analizando la cadena de tiempo t
siguiendo el patrón dado en la cadena format
(ver DateFormat
para la sintaxis).
Este método crea un objeto DateFormat
cada vez que se llama. Se recomienda que crees un objeto DateFormat
en su lugar y lo uses como el segundo argumento para evitar la pérdida de rendimiento al usar el mismo formato repetidamente.
Ejemplos
julia> Time("12:34pm", "HH:MMp")
12:34:00
julia> a = ("12:34pm", "2:34am");
julia> [Time(d, dateformat"HH:MMp") for d ∈ a] # preferido
2-element Vector{Time}:
12:34:00
02:34:00
Dates.Time
— MethodTime(t::AbstractString, df::DateFormat=ISOTimeFormat) -> Time
Construye un Time
analizando la cadena de fecha y hora t
siguiendo el patrón dado en el objeto DateFormat
, o dateformat"HH:MM:SS.s" si se omite.
Similar a Time(::AbstractString, ::AbstractString)
pero más eficiente al analizar repetidamente cadenas de tiempo con formato similar con un objeto DateFormat
precreado.
Dates.now
— Methodnow() -> DateTime
Devuelve un DateTime
correspondiente a la hora del sistema del usuario, incluyendo la configuración de la zona horaria del sistema.
Dates.now
— Methodnow(::Type{UTC}) -> DateTime
Devuelve un DateTime
correspondiente a la hora del sistema del usuario en UTC/GMT. Para otras zonas horarias, consulta el paquete TimeZones.jl.
Ejemplos
julia> now(UTC)
2023-01-04T10:52:24.864
Base.eps
— Methodeps(::Type{DateTime}) -> Milisegundo
eps(::Type{Date}) -> Día
eps(::Type{Time}) -> Nanosegundo
eps(::TimeType) -> Período
Devuelve el valor de unidad más pequeño soportado por el TimeType
.
Ejemplos
julia> eps(DateTime)
1 milisegundo
julia> eps(Date)
1 día
julia> eps(Time)
1 nanosegundo
Accessor Functions
Dates.year
— Functionyear(dt::TimeType) -> Int64
El año de un Date
o DateTime
como un Int64
.
Dates.month
— Functionmonth(dt::TimeType) -> Int64
El mes de un Date
o DateTime
como un Int64
.
Dates.week
— Functionweek(dt::TimeType) -> Int64
Devuelve la fecha de la semana ISO de un Date
o DateTime
como un Int64
. Ten en cuenta que la primera semana de un año es la semana que contiene el primer jueves del año, lo que puede resultar en fechas anteriores al 4 de enero que estén en la última semana del año anterior. Por ejemplo, week(Date(2005, 1, 1))
es la 53ª semana de 2004.
Ejemplos
julia> week(Date(1989, 6, 22))
25
julia> week(Date(2005, 1, 1))
53
julia> week(Date(2004, 12, 31))
53
Dates.day
— Functionday(dt::TimeType) -> Int64
El día del mes de un Date
o DateTime
como un Int64
.
Dates.hour
— Functionhour(dt::DateTime) -> Int64
La hora del día de un DateTime
como un Int64
.
hour(t::Time) -> Int64
La hora de un Time
como un Int64
.
Dates.minute
— Functionminute(dt::DateTime) -> Int64
El minuto de un DateTime
como un Int64
.
minute(t::Time) -> Int64
El minuto de un Time
como un Int64
.
Dates.second
— Functionsecond(dt::DateTime) -> Int64
El segundo de un DateTime
como un Int64
.
second(t::Time) -> Int64
El segundo de un Time
como un Int64
.
Dates.millisecond
— Functionmillisecond(dt::DateTime) -> Int64
El milisegundo de un DateTime
como un Int64
.
milisegundo(t::Time) -> Int64
El milisegundo de un Time
como un Int64
.
Dates.microsecond
— Functionmicrosegundo(t::Time) -> Int64
El microsegundo de un Time
como un Int64
.
Dates.nanosecond
— Functionnanosecond(t::Time) -> Int64
El nanosegundo de un Time
como un Int64
.
Dates.Year
— MethodYear(v)
Construye un objeto Year
con el valor v
dado. La entrada debe ser convertible sin pérdida a un Int64
.
Dates.Month
— MethodMonth(v)
Construye un objeto Month
con el valor v
dado. La entrada debe ser convertible sin pérdida a un Int64
.
Dates.Week
— MethodWeek(v)
Construye un objeto Week
con el valor v
dado. La entrada debe ser convertible sin pérdida a un Int64
.
Dates.Day
— MethodDay(v)
Construye un objeto Day
con el valor v
dado. La entrada debe ser convertible sin pérdida a un Int64
.
Dates.Hour
— MethodHour(dt::DateTime) -> Hour
La parte de la hora de un DateTime como un Hour
.
Dates.Minute
— MethodMinute(dt::DateTime) -> Minute
La parte de minutos de un DateTime como un Minute
.
Dates.Second
— MethodSecond(dt::DateTime) -> Second
La parte de segundos de un DateTime como un Second
.
Dates.Millisecond
— MethodMillisecond(dt::DateTime) -> Millisecond
La parte de milisegundos de un DateTime como un Millisecond
.
Dates.Microsecond
— MethodMicrosegundo(dt::Time) -> Microsegundo
La parte de microsegundo de un Tiempo como un Microsegundo
.
Dates.Nanosecond
— MethodNanosegundo(dt::Time) -> Nanosegundo
La parte de nanosegundos de un Tiempo como un Nanosegundo
.
Dates.yearmonth
— Functionyearmonth(dt::TimeType) -> (Int64, Int64)
Devuelve simultáneamente las partes del año y del mes de un Date
o DateTime
.
Dates.monthday
— Functionmonthday(dt::TimeType) -> (Int64, Int64)
Devuelve simultáneamente las partes del mes y del día de una Date
o DateTime
.
Dates.yearmonthday
— Functionyearmonthday(dt::TimeType) -> (Int64, Int64, Int64)
Devuelve simultáneamente el año, el mes y el día de un Date
o DateTime
.
Query Functions
Dates.dayname
— Functiondayname(dt::TimeType; locale="español") -> String
dayname(day::Integer; locale="español") -> String
Devuelve el nombre completo del día correspondiente al día de la semana de la Fecha
o FechaHora
en el locale
dado. También acepta Integer
.
Ejemplos
julia> dayname(Date("2000-01-01"))
"Sábado"
julia> dayname(4)
"Jueves"
Dates.dayabbr
— Functiondayabbr(dt::TimeType; locale="español") -> String
dayabbr(day::Integer; locale="español") -> String
Devuelve el nombre abreviado correspondiente al día de la semana de la Fecha
o FechaHora
en el locale
dado. También acepta Integer
.
Ejemplos
julia> dayabbr(Date("2000-01-01"))
"Sab"
julia> dayabbr(3)
"Mié"
Dates.dayofweek
— Functiondayofweek(dt::TimeType) -> Int64
Devuelve el día de la semana como un Int64
con 1 = Lunes, 2 = Martes, etc.
.
Ejemplos
julia> dayofweek(Date("2000-01-01"))
6
Dates.dayofmonth
— Functiondayofmonth(dt::TimeType) -> Int64
El día del mes de un Date
o DateTime
como un Int64
.
Dates.dayofweekofmonth
— Functiondayofweekofmonth(dt::TimeType) -> Int
Para el día de la semana de dt
, devuelve qué número es en el mes de dt
. Así que si el día de la semana de dt
es lunes, entonces 1 = Primer lunes del mes, 2 = Segundo lunes del mes, etc.
En el rango 1:5.
Ejemplos
julia> dayofweekofmonth(Date("2000-02-01"))
1
julia> dayofweekofmonth(Date("2000-02-08"))
2
julia> dayofweekofmonth(Date("2000-02-15"))
3
Dates.daysofweekinmonth
— Functiondaysofweekinmonth(dt::TimeType) -> Int
Para el día de la semana de dt
, devuelve el número total de ese día de la semana en el mes de dt
. Devuelve 4 o 5. Útil en expresiones temporales para especificar el último día de una semana en un mes incluyendo dayofweekofmonth(dt) == daysofweekinmonth(dt)
en la función ajustadora.
Ejemplos
julia> daysofweekinmonth(Date("2005-01-01"))
5
julia> daysofweekinmonth(Date("2005-01-04"))
4
Dates.monthname
— Functionmonthname(dt::TimeType; locale="español") -> String
monthname(month::Integer, locale="español") -> String
Devuelve el nombre completo del mes del Date
o DateTime
o Integer
en el locale
dado.
Ejemplos
julia> monthname(Date("2005-01-04"))
"Enero"
julia> monthname(2)
"Febrero"
Dates.monthabbr
— Functionmonthabbr(dt::TimeType; locale="español") -> String
monthabbr(month::Integer, locale="español") -> String
Devuelve el nombre abreviado del mes del Date
o DateTime
o Integer
en el locale
dado.
Ejemplos
julia> monthabbr(Date("2005-01-04"))
"Ene"
julia> monthabbr(2)
"Feb"
Dates.daysinmonth
— Functiondaysinmonth(dt::TimeType) -> Int
Devuelve el número de días en el mes de dt
. El valor será 28, 29, 30 o 31.
Ejemplos
julia> daysinmonth(Date("2000-01"))
31
julia> daysinmonth(Date("2001-02"))
28
julia> daysinmonth(Date("2000-02"))
29
Dates.isleapyear
— Functionisleapyear(dt::TimeType) -> Bool
Devuelve true
si el año de dt
es un año bisiesto.
Ejemplos
julia> isleapyear(Date("2004"))
true
julia> isleapyear(Date("2005"))
false
Dates.dayofyear
— Functiondayofyear(dt::TimeType) -> Int
Devuelve el día del año para dt
, siendo el 1 de enero el día 1.
Dates.daysinyear
— Functiondaysinyear(dt::TimeType) -> Int
Devuelve 366 si el año de dt
es un año bisiesto, de lo contrario devuelve 365.
Ejemplos
julia> daysinyear(1999)
365
julia> daysinyear(2000)
366
Dates.quarterofyear
— Functionquarterofyear(dt::TimeType) -> Int
Devuelve el trimestre en el que se encuentra dt
. El rango de valores es 1:4.
Dates.dayofquarter
— Functiondayofquarter(dt::TimeType) -> Int
Devuelve el día del trimestre actual de dt
. El rango de valores es 1:92.
Adjuster Functions
Base.trunc
— Methodtrunc(dt::TimeType, ::Type{Period}) -> TimeType
Trunca el valor de dt
de acuerdo con el tipo de Period
proporcionado.
Ejemplos
julia> trunc(DateTime("1996-01-01T12:30:00"), Day)
1996-01-01T00:00:00
Dates.firstdayofweek
— Functionfirstdayofweek(dt::TimeType) -> TimeType
Ajusta dt
al lunes de su semana.
Ejemplos
julia> firstdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-01T00:00:00
Dates.lastdayofweek
— Functionlastdayofweek(dt::TimeType) -> TimeType
Ajusta dt
al domingo de su semana.
Ejemplos
julia> lastdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-07T00:00:00
Dates.firstdayofmonth
— Functionfirstdayofmonth(dt::TimeType) -> TimeType
Ajusta dt
al primer día de su mes.
Ejemplos
julia> firstdayofmonth(DateTime("1996-05-20"))
1996-05-01T00:00:00
Dates.lastdayofmonth
— Functionlastdayofmonth(dt::TimeType) -> TimeType
Ajusta dt
al último día de su mes.
Ejemplos
julia> lastdayofmonth(DateTime("1996-05-20"))
1996-05-31T00:00:00
Dates.firstdayofyear
— Functionfirstdayofyear(dt::TimeType) -> TimeType
Ajusta dt
al primer día de su año.
Ejemplos
julia> firstdayofyear(DateTime("1996-05-20"))
1996-01-01T00:00:00
Dates.lastdayofyear
— Functionlastdayofyear(dt::TimeType) -> TimeType
Ajusta dt
al último día de su año.
Ejemplos
julia> lastdayofyear(DateTime("1996-05-20"))
1996-12-31T00:00:00
Dates.firstdayofquarter
— Functionfirstdayofquarter(dt::TimeType) -> TimeType
Ajusta dt
al primer día de su trimestre.
Ejemplos
julia> firstdayofquarter(DateTime("1996-05-20"))
1996-04-01T00:00:00
julia> firstdayofquarter(DateTime("1996-08-20"))
1996-07-01T00:00:00
Dates.lastdayofquarter
— Functionlastdayofquarter(dt::TimeType) -> TimeType
Ajusta dt
al último día de su trimestre.
Ejemplos
julia> lastdayofquarter(DateTime("1996-05-20"))
1996-06-30T00:00:00
julia> lastdayofquarter(DateTime("1996-08-20"))
1996-09-30T00:00:00
Dates.tonext
— Methodtonext(dt::TimeType, dow::Int; same::Bool=false) -> TimeType
Ajusta dt
al siguiente día de la semana correspondiente a dow
con 1 = Lunes, 2 = Martes, etc
. Establecer same=true
permite que el dt
actual se considere como el siguiente dow
, lo que permite que no se realice ningún ajuste.
Dates.toprev
— Methodtoprev(dt::TimeType, dow::Int; same::Bool=false) -> TimeType
Ajusta dt
al día de la semana anterior correspondiente a dow
con 1 = Lunes, 2 = Martes, etc
. Establecer same=true
permite que el dt
actual se considere como el dow
anterior, lo que permite que no ocurra ningún ajuste.
Dates.tofirst
— Functiontofirst(dt::TimeType, dow::Int; of=Month) -> TimeType
Ajusta dt
al primer dow
de su mes. Alternativamente, of=Year
ajustará al primer dow
del año.
Dates.tolast
— Functiontolast(dt::TimeType, dow::Int; of=Month) -> TimeType
Ajusta dt
al último dow
de su mes. Alternativamente, of=Year
ajustará al último dow
del año.
Dates.tonext
— Methodtonext(func::Function, dt::TimeType; step=Day(1), limit=10000, same=false) -> TimeType
Ajusta dt
iterando como máximo limit
iteraciones por incrementos de step
hasta que func
devuelva true
. func
debe tomar un único argumento de tipo TimeType
y devolver un Bool
. same
permite que dt
se considere al satisfacer func
.
Dates.toprev
— Methodtoprev(func::Function, dt::TimeType; step=Day(-1), limit=10000, same=false) -> TimeType
Ajusta dt
iterando como máximo limit
iteraciones por incrementos de step
hasta que func
devuelva true
. func
debe tomar un único argumento de tipo TimeType
y devolver un Bool
. same
permite que dt
se considere al satisfacer func
.
Periods
Dates.Period
— MethodAño(v)
Trimestre(v)
Mes(v)
Semana(v)
Día(v)
Hora(v)
Minuto(v)
Segundo(v)
Milisegundo(v)
Microsegundo(v)
Nanosegundo(v)
Construya un tipo Period
con el valor v
dado. La entrada debe ser convertible sin pérdida a un Int64
.
Dates.CompoundPeriod
— MethodCompoundPeriod(periods) -> CompoundPeriod
Construye un CompoundPeriod
a partir de un Vector
de Period
s. Todos los Period
s del mismo tipo se sumarán.
Ejemplos
julia> Dates.CompoundPeriod(Dates.Hour(12), Dates.Hour(13))
25 hours
julia> Dates.CompoundPeriod(Dates.Hour(-1), Dates.Minute(1))
-1 hour, 1 minute
julia> Dates.CompoundPeriod(Dates.Month(1), Dates.Week(-2))
1 month, -2 weeks
julia> Dates.CompoundPeriod(Dates.Minute(50000))
50000 minutes
Dates.canonicalize
— Functioncanonicalize(::CompoundPeriod) -> CompoundPeriod
Reduce el CompoundPeriod
a su forma canónica aplicando las siguientes reglas:
- Cualquier
Period
lo suficientemente grande como para ser representado parcialmente por unPeriod
más grueso se descompondrá en múltiplesPeriod
s (por ejemplo,Hour(30)
se convierte enDay(1) + Hour(6)
) - Los
Period
s con signos opuestos se combinarán cuando sea posible (por ejemplo,Hour(1) - Day(1)
se convierte en-Hour(23)
)
Ejemplos
julia> canonicalize(Dates.CompoundPeriod(Dates.Hour(12), Dates.Hour(13)))
1 día, 1 hora
julia> canonicalize(Dates.CompoundPeriod(Dates.Hour(-1), Dates.Minute(1)))
-59 minutos
julia> canonicalize(Dates.CompoundPeriod(Dates.Month(1), Dates.Week(-2)))
1 mes, -2 semanas
julia> canonicalize(Dates.CompoundPeriod(Dates.Minute(50000)))
4 semanas, 6 días, 17 horas, 20 minutos
Dates.value
— FunctionDates.value(x::Period) -> Int64
Para un período dado, devuelve el valor asociado con ese período. Por ejemplo, value(Millisecond(10))
devuelve 10 como un entero.
Dates.default
— Functiondefault(p::Period) -> Period
Devuelve un valor "predeterminado" sensato para el Periodo de entrada devolviendo T(1)
para Año, Mes y Día, y T(0)
para Hora, Minuto, Segundo y Milisegundo.
Dates.periods
— FunctionDates.periods(::CompoundPeriod) -> Vector{Period}
Devuelve el Vector
de Period
s que componen el CompoundPeriod
dado.
Esta función requiere Julia 1.7 o posterior.
Rounding Functions
Los valores de Date
y DateTime
se pueden redondear a una resolución especificada (por ejemplo, 1 mes o 15 minutos) con floor
, ceil
o round
.
Base.floor
— Methodfloor(dt::TimeType, p::Period) -> TimeType
Devuelve la fecha Date
o DateTime
más cercana menor o igual a dt
con resolución p
.
Para conveniencia, p
puede ser un tipo en lugar de un valor: floor(dt, Dates.Hour)
es un atajo para floor(dt, Dates.Hour(1))
.
julia> floor(Date(1985, 8, 16), Month)
1985-08-01
julia> floor(DateTime(2013, 2, 13, 0, 31, 20), Minute(15))
2013-02-13T00:30:00
julia> floor(DateTime(2016, 8, 6, 12, 0, 0), Day)
2016-08-06T00:00:00
Base.ceil
— Methodceil(dt::TimeType, p::Period) -> TimeType
Devuelve la Date
o DateTime
más cercana mayor o igual a dt
con resolución p
.
Para conveniencia, p
puede ser un tipo en lugar de un valor: ceil(dt, Dates.Hour)
es un atajo para ceil(dt, Dates.Hour(1))
.
julia> ceil(Date(1985, 8, 16), Month)
1985-09-01
julia> ceil(DateTime(2013, 2, 13, 0, 31, 20), Minute(15))
2013-02-13T00:45:00
julia> ceil(DateTime(2016, 8, 6, 12, 0, 0), Day)
2016-08-07T00:00:00
Base.round
— Methodround(dt::TimeType, p::Period, [r::RoundingMode]) -> TimeType
Devuelve la Date
o DateTime
más cercana a dt
con la resolución p
. Por defecto (RoundNearestTiesUp
), los empates (por ejemplo, redondear 9:30 a la hora más cercana) se redondearán hacia arriba.
Para conveniencia, p
puede ser un tipo en lugar de un valor: round(dt, Dates.Hour)
es un atajo para round(dt, Dates.Hour(1))
.
julia> round(Date(1985, 8, 16), Month)
1985-08-01
julia> round(DateTime(2013, 2, 13, 0, 31, 20), Minute(15))
2013-02-13T00:30:00
julia> round(DateTime(2016, 8, 6, 12, 0, 0), Day)
2016-08-07T00:00:00
Los modos de redondeo válidos para round(::TimeType, ::Period, ::RoundingMode)
son RoundNearestTiesUp
(por defecto), RoundDown
(floor
), y RoundUp
(ceil
).
La mayoría de los valores de Period
también se pueden redondear a una resolución especificada:
Base.floor
— Methodfloor(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> T
Redondea x
hacia abajo al múltiplo más cercano de precision
. Si x
y precision
son diferentes subtipos de Period
, el valor de retorno tendrá el mismo tipo que precision
.
Para conveniencia, precision
puede ser un tipo en lugar de un valor: floor(x, Dates.Hour)
es un atajo para floor(x, Dates.Hour(1))
.
julia> floor(Day(16), Week)
2 weeks
julia> floor(Minute(44), Minute(15))
30 minutes
julia> floor(Hour(36), Day)
1 day
No se admite el redondeo a una precision
de Month
s o Year
s, ya que estos Period
s tienen una longitud inconsistente. ```
Base.ceil
— Methodceil(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> T
Redondea x
hacia arriba al múltiplo más cercano de precision
. Si x
y precision
son diferentes subtipos de Period
, el valor de retorno tendrá el mismo tipo que precision
.
Para conveniencia, precision
puede ser un tipo en lugar de un valor: ceil(x, Dates.Hour)
es un atajo para ceil(x, Dates.Hour(1))
.
julia> ceil(Day(16), Week)
3 weeks
julia> ceil(Minute(44), Minute(15))
45 minutes
julia> ceil(Hour(36), Day)
2 days
No se admite el redondeo a una precision
de Month
s o Year
s, ya que estos Period
s tienen una longitud inconsistente. ```
Base.round
— Methodround(x::Period, precision::T, [r::RoundingMode]) where T <: Union{TimePeriod, Week, Day} -> T
Redondea x
al múltiplo más cercano de precision
. Si x
y precision
son diferentes subtipos de Period
, el valor de retorno tendrá el mismo tipo que precision
. Por defecto (RoundNearestTiesUp
), los empates (por ejemplo, redondear 90 minutos a la hora más cercana) se redondearán hacia arriba.
Para mayor comodidad, precision
puede ser un tipo en lugar de un valor: round(x, Dates.Hour)
es un atajo para round(x, Dates.Hour(1))
.
julia> round(Day(16), Week)
2 weeks
julia> round(Minute(44), Minute(15))
45 minutes
julia> round(Hour(36), Day)
2 days
Los modos de redondeo válidos para round(::Period, ::T, ::RoundingMode)
son RoundNearestTiesUp
(por defecto), RoundDown
(floor
), y RoundUp
(ceil
).
No se admite el redondeo a una precision
de Month
s o Year
s, ya que estos Period
s son de longitud inconsistente.
Las siguientes funciones no están exportadas:
Dates.floorceil
— Functionfloorceil(dt::TimeType, p::Period) -> (TimeType, TimeType)
Devuelve simultáneamente el floor
y el ceil
de un Date
o DateTime
a la resolución p
. Más eficiente que llamar a floor
y ceil
individualmente.
floorceil(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> (T, T)
Devuelve simultáneamente el floor
y el ceil
de Period
a la resolución p
. Más eficiente que llamar a floor
y ceil
individualmente.
Dates.epochdays2date
— Functionepochdays2date(días) -> Fecha
Toma el número de días desde la época de redondeo (0000-01-01T00:00:00
) y devuelve la Fecha
correspondiente.
Dates.epochms2datetime
— Functionepochms2datetime(milliseconds) -> DateTime
Toma el número de milisegundos desde la época de redondeo (0000-01-01T00:00:00
) y devuelve el DateTime
correspondiente.
Dates.date2epochdays
— Functiondate2epochdays(dt::Date) -> Int64
Toma la Fecha
dada y devuelve el número de días desde el epoch de redondeo (0000-01-01T00:00:00
) como un Int64
.
Dates.datetime2epochms
— Functiondatetime2epochms(dt::DateTime) -> Int64
Toma el DateTime
dado y devuelve el número de milisegundos desde la época de redondeo (0000-01-01T00:00:00
) como un Int64
.
Conversion Functions
Dates.today
— Functiontoday() -> Date
Devuelve la parte de la fecha de now()
.
Dates.unix2datetime
— Functionunix2datetime(x) -> DateTime
Toma el número de segundos desde la época unix 1970-01-01T00:00:00
y conviértelo al correspondiente DateTime
.
Dates.datetime2unix
— Functiondatetime2unix(dt::DateTime) -> Float64
Toma el DateTime
dado y devuelve el número de segundos desde la época unix 1970-01-01T00:00:00
como un Float64
.
Dates.julian2datetime
— Functionjulian2datetime(julian_days) -> DateTime
Toma el número de días del calendario juliano desde la época -4713-11-24T12:00:00
y devuelve el correspondiente DateTime
.
Dates.datetime2julian
— Functiondatetime2julian(dt::DateTime) -> Float64
Toma el DateTime
dado y devuelve el número de días del calendario juliano desde el epoch juliano -4713-11-24T12:00:00
como un Float64
.
Dates.rata2datetime
— Functionrata2datetime(días) -> DateTime
Toma el número de días Rata Die desde la época 0000-12-31T00:00:00
y devuelve el correspondiente DateTime
.
Dates.datetime2rata
— Functiondatetime2rata(dt::TimeType) -> Int64
Devuelve el número de días Rata Die desde la época a partir de la Date
o DateTime
dada.
Constants
Días de la Semana:
Variable | Abbr. | Value (Int) |
---|---|---|
Monday | Mon | 1 |
Tuesday | Tue | 2 |
Wednesday | Wed | 3 |
Thursday | Thu | 4 |
Friday | Fri | 5 |
Saturday | Sat | 6 |
Sunday | Sun | 7 |
Meses del Año:
Variable | Abbr. | Value (Int) |
---|---|---|
January | Jan | 1 |
February | Feb | 2 |
March | Mar | 3 |
April | Apr | 4 |
May | May | 5 |
June | Jun | 6 |
July | Jul | 7 |
August | Aug | 8 |
September | Sep | 9 |
October | Oct | 10 |
November | Nov | 11 |
December | Dec | 12 |
Common Date Formatters
Dates.ISODateTimeFormat
— ConstantDates.ISODateTimeFormat
Describe el formato ISO8601 para una fecha y hora. Este es el valor predeterminado para Dates.format
de un DateTime
.
Ejemplos
julia> Dates.format(DateTime(2018, 8, 8, 12, 0, 43, 1), ISODateTimeFormat)
"2018-08-08T12:00:43.001"
Dates.ISODateFormat
— ConstantDates.ISODateFormat
Describe el formato ISO8601 para una fecha. Este es el valor predeterminado para Dates.format
de un Date
.
Ejemplos
julia> Dates.format(Date(2018, 8, 8), ISODateFormat)
"2018-08-08"
Dates.ISOTimeFormat
— ConstantDates.ISOTimeFormat
Describe el formato ISO8601 para un tiempo. Este es el valor predeterminado para Dates.format
de un Time
.
Ejemplos
julia> Dates.format(Time(12, 0, 43, 1), ISOTimeFormat)
"12:00:43.001"
Dates.RFC1123Format
— ConstantDates.RFC1123Format
Describe el formato RFC1123 para una fecha y hora.
Ejemplos
julia> Dates.format(DateTime(2018, 8, 8, 12, 0, 43, 1), RFC1123Format)
"Wed, 08 Aug 2018 12:00:43"
- 1The notion of the UT second is actually quite fundamental. There are basically two different notions of time generally accepted, one based on the physical rotation of the earth (one full rotation = 1 day), the other based on the SI second (a fixed, constant value). These are radically different! Think about it, a "UT second", as defined relative to the rotation of the earth, may have a different absolute length depending on the day! Anyway, the fact that
Date
andDateTime
are based on UT seconds is a simplifying, yet honest assumption so that things like leap seconds and all their complexity can be avoided. This basis of time is formally called UT or UT1. Basing types on the UT second basically means that every minute has 60 seconds and every day has 24 hours and leads to more natural calculations when working with calendar dates.