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.

Julia 1.9

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 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 TimeType4d61726b646f776e2e436f64652822222c2022726f756e642229_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.PeriodType
Período
Año
Trimestre
Mes
Semana
Día
Hora
Minuto
Segundo
Milisegundo
Microsegundo
Nanosegundo

Period types represent discrete, human representations of time.

source
Dates.CompoundPeriodType
CompoundPeriod

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.

source
Dates.InstantType
Instant

Los tipos Instant representan representaciones de tiempo basadas en enteros, como líneas de tiempo continuas que comienzan desde una época.

source
Dates.UTInstantType
UTInstant{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.

source
Dates.TimeTypeType
TimeType

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.

source
Dates.DateTimeType
DateTime

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
source
Dates.DateType
Fecha

Date envuelve un UTInstant{Day} e interpreta según el calendario gregoriano proleptico.

source
Dates.TimeType
Tiempo

Tiempo envuelve un Nanosegundo y representa un momento específico en un día de 24 horas.

source
Dates.TimeZoneType
TimeZone

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

source
Dates.UTCType
UTC

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.

source

Dates Functions

Dates.DateTimeMethod
DateTime(y, [m, d, h, mi, s, ms]) -> DateTime

Construye un tipo DateTime por partes. Los argumentos deben ser convertibles a Int64.

source
Dates.DateTimeMethod
DateTime(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).

source
Dates.DateTimeMethod
DateTime(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:
[...]
source
Dates.DateTimeMethod
DateTime(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.

source
Dates.DateTimeMethod
DateTime(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).

Note

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
source
Dates.formatMethod
format(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ódigoEjemplosComentario
y6Año numérico con un ancho fijo
Y1996Año numérico con un ancho mínimo
m1, 12Mes numérico con un ancho mínimo
uEneNombre del mes abreviado a 3 caracteres según el locale
UEneroNombre completo del mes según la palabra clave locale
d1, 31Día del mes con un ancho mínimo
H0, 23Hora (reloj de 24 horas) con un ancho mínimo
M0, 59Minuto con un ancho mínimo
S0, 59Segundo con un ancho mínimo
s000, 500Milisegundo con un ancho mínimo de 3
eLun, MarDías de la semana abreviados
ELunesNombre 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".

source
Dates.DateFormatType
DateFormat(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ódigoCoincideComentario
Y1996, 96Devuelve el año de 1996, 0096
y1996, 96Igual que Y en parse pero descarta dígitos excesivos en format
m1, 01Coincide con meses de 1 o 2 dígitos
uEneCoincide con meses abreviados según la palabra clave locale
UEneroCoincide con nombres completos de meses según la palabra clave locale
d1, 01Coincide con días de 1 o 2 dígitos
H00Coincide con horas (reloj de 24 horas)
I00Para mostrar horas con reloj de 12 horas
M00Coincide con minutos
S00Coincide con segundos
s.500Coincide con milisegundos
eLun, MarCoincide con días de la semana abreviados
ELunesCoincide con nombres completos de días de la semana
pAMCoincide con AM/PM (sin distinción de mayúsculas y minúsculas)
yyyymmdd19960101Coincide 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.

source
Dates.@dateformat_strMacro
dateformat"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.

source
Dates.DateTimeMethod
DateTime(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.

source
Dates.DateMethod
Date(y, [m, d]) -> Date

Construye un tipo Date por partes. Los argumentos deben ser convertibles a Int64.

source
Dates.DateMethod
Date(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).

source
Dates.DateMethod
Date(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:
[...]
source
Dates.DateMethod
Date(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.

source
Dates.DateMethod
Date(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).

Note

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
source
Dates.DateMethod
Date(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.

source
Dates.TimeMethod
Time(h, [mi, s, ms, us, ns]) -> Time

Construye un tipo Time por partes. Los argumentos deben ser convertibles a Int64.

source
Dates.TimeMethod
Time(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).

source
Dates.TimeMethod
Time(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:
[...]
source
Dates.TimeMethod
Time(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.

source
Dates.TimeMethod
Time(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).

Note

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
source
Dates.TimeMethod
Time(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.

source
Dates.nowMethod
now() -> DateTime

Devuelve un DateTime correspondiente a la hora del sistema del usuario, incluyendo la configuración de la zona horaria del sistema.

source
Dates.nowMethod
now(::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
source
Base.epsMethod
eps(::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
source

Accessor Functions

Dates.weekFunction
week(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
source
Dates.dayFunction
day(dt::TimeType) -> Int64

El día del mes de un Date o DateTime como un Int64.

source
Dates.hourFunction
hour(dt::DateTime) -> Int64

La hora del día de un DateTime como un Int64.

source
hour(t::Time) -> Int64

La hora de un Time como un Int64.

source
Dates.YearMethod
Year(v)

Construye un objeto Year con el valor v dado. La entrada debe ser convertible sin pérdida a un Int64.

source
Dates.MonthMethod
Month(v)

Construye un objeto Month con el valor v dado. La entrada debe ser convertible sin pérdida a un Int64.

source
Dates.WeekMethod
Week(v)

Construye un objeto Week con el valor v dado. La entrada debe ser convertible sin pérdida a un Int64.

source
Dates.DayMethod
Day(v)

Construye un objeto Day con el valor v dado. La entrada debe ser convertible sin pérdida a un Int64.

source
Dates.HourMethod
Hour(dt::DateTime) -> Hour

La parte de la hora de un DateTime como un Hour.

source
Dates.MinuteMethod
Minute(dt::DateTime) -> Minute

La parte de minutos de un DateTime como un Minute.

source
Dates.SecondMethod
Second(dt::DateTime) -> Second

La parte de segundos de un DateTime como un Second.

source
Dates.MillisecondMethod
Millisecond(dt::DateTime) -> Millisecond

La parte de milisegundos de un DateTime como un Millisecond.

source
Dates.MicrosecondMethod
Microsegundo(dt::Time) -> Microsegundo

La parte de microsegundo de un Tiempo como un Microsegundo.

source
Dates.NanosecondMethod
Nanosegundo(dt::Time) -> Nanosegundo

La parte de nanosegundos de un Tiempo como un Nanosegundo.

source
Dates.yearmonthFunction
yearmonth(dt::TimeType) -> (Int64, Int64)

Devuelve simultáneamente las partes del año y del mes de un Date o DateTime.

source
Dates.monthdayFunction
monthday(dt::TimeType) -> (Int64, Int64)

Devuelve simultáneamente las partes del mes y del día de una Date o DateTime.

source
Dates.yearmonthdayFunction
yearmonthday(dt::TimeType) -> (Int64, Int64, Int64)

Devuelve simultáneamente el año, el mes y el día de un Date o DateTime.

source

Query Functions

Dates.daynameFunction
dayname(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"
source
Dates.dayabbrFunction
dayabbr(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é"
source
Dates.dayofweekFunction
dayofweek(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
source
Dates.dayofweekofmonthFunction
dayofweekofmonth(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
source
Dates.daysofweekinmonthFunction
daysofweekinmonth(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
source
Dates.monthnameFunction
monthname(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"
source
Dates.monthabbrFunction
monthabbr(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"
source
Dates.daysinmonthFunction
daysinmonth(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
source
Dates.isleapyearFunction
isleapyear(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
source
Dates.dayofyearFunction
dayofyear(dt::TimeType) -> Int

Devuelve el día del año para dt, siendo el 1 de enero el día 1.

source
Dates.daysinyearFunction
daysinyear(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
source
Dates.quarterofyearFunction
quarterofyear(dt::TimeType) -> Int

Devuelve el trimestre en el que se encuentra dt. El rango de valores es 1:4.

source
Dates.dayofquarterFunction
dayofquarter(dt::TimeType) -> Int

Devuelve el día del trimestre actual de dt. El rango de valores es 1:92.

source

Adjuster Functions

Base.truncMethod
trunc(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
source
Dates.firstdayofweekFunction
firstdayofweek(dt::TimeType) -> TimeType

Ajusta dt al lunes de su semana.

Ejemplos

julia> firstdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-01T00:00:00
source
Dates.lastdayofweekFunction
lastdayofweek(dt::TimeType) -> TimeType

Ajusta dt al domingo de su semana.

Ejemplos

julia> lastdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-07T00:00:00
source
Dates.firstdayofmonthFunction
firstdayofmonth(dt::TimeType) -> TimeType

Ajusta dt al primer día de su mes.

Ejemplos

julia> firstdayofmonth(DateTime("1996-05-20"))
1996-05-01T00:00:00
source
Dates.lastdayofmonthFunction
lastdayofmonth(dt::TimeType) -> TimeType

Ajusta dt al último día de su mes.

Ejemplos

julia> lastdayofmonth(DateTime("1996-05-20"))
1996-05-31T00:00:00
source
Dates.firstdayofyearFunction
firstdayofyear(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
source
Dates.lastdayofyearFunction
lastdayofyear(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
source
Dates.firstdayofquarterFunction
firstdayofquarter(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
source
Dates.lastdayofquarterFunction
lastdayofquarter(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
source
Dates.tonextMethod
tonext(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.

source
Dates.toprevMethod
toprev(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.

source
Dates.tofirstFunction
tofirst(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.

source
Dates.tolastFunction
tolast(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.

source
Dates.tonextMethod
tonext(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.

source
Dates.toprevMethod
toprev(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.

source

Periods

Dates.PeriodMethod
Añ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.

source
Dates.CompoundPeriodMethod
CompoundPeriod(periods) -> CompoundPeriod

Construye un CompoundPeriod a partir de un Vector de Periods. Todos los Periods 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
source
Dates.canonicalizeFunction
canonicalize(::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 un Period más grueso se descompondrá en múltiples Periods (por ejemplo, Hour(30) se convierte en Day(1) + Hour(6))
  • Los Periods 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
source
Dates.valueFunction
Dates.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.

source
Dates.defaultFunction
default(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.

source
Dates.periodsFunction
Dates.periods(::CompoundPeriod) -> Vector{Period}

Devuelve el Vector de Periods que componen el CompoundPeriod dado.

Julia 1.7

Esta función requiere Julia 1.7 o posterior.

source

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.floorMethod
floor(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
source
Base.ceilMethod
ceil(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
source
Base.roundMethod
round(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).

source

La mayoría de los valores de Period también se pueden redondear a una resolución especificada:

Base.floorMethod
floor(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 Months o Years, ya que estos Periods tienen una longitud inconsistente. ```

source
Base.ceilMethod
ceil(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 Months o Years, ya que estos Periods tienen una longitud inconsistente. ```

source
Base.roundMethod
round(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 Months o Years, ya que estos Periods son de longitud inconsistente.

source

Las siguientes funciones no están exportadas:

Dates.floorceilFunction
floorceil(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.

source
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.

source
Dates.epochdays2dateFunction
epochdays2date(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.

source
Dates.epochms2datetimeFunction
epochms2datetime(milliseconds) -> DateTime

Toma el número de milisegundos desde la época de redondeo (0000-01-01T00:00:00) y devuelve el DateTime correspondiente.

source
Dates.date2epochdaysFunction
date2epochdays(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.

source
Dates.datetime2epochmsFunction
datetime2epochms(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.

source

Conversion Functions

Dates.unix2datetimeFunction
unix2datetime(x) -> DateTime

Toma el número de segundos desde la época unix 1970-01-01T00:00:00 y conviértelo al correspondiente DateTime.

source
Dates.datetime2unixFunction
datetime2unix(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.

source
Dates.julian2datetimeFunction
julian2datetime(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.

source
Dates.datetime2julianFunction
datetime2julian(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.

source
Dates.rata2datetimeFunction
rata2datetime(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.

source
Dates.datetime2rataFunction
datetime2rata(dt::TimeType) -> Int64

Devuelve el número de días Rata Die desde la época a partir de la Date o DateTime dada.

source

Constants

Días de la Semana:

VariableAbbr.Value (Int)
MondayMon1
TuesdayTue2
WednesdayWed3
ThursdayThu4
FridayFri5
SaturdaySat6
SundaySun7

Meses del Año:

VariableAbbr.Value (Int)
JanuaryJan1
FebruaryFeb2
MarchMar3
AprilApr4
MayMay5
JuneJun6
JulyJul7
AugustAug8
SeptemberSep9
OctoberOct10
NovemberNov11
DecemberDec12

Common Date Formatters

Dates.ISODateTimeFormatConstant
Dates.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"
source
Dates.ISODateFormatConstant
Dates.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"
source
Dates.ISOTimeFormatConstant
Dates.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"
source
Dates.RFC1123FormatConstant
Dates.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"
source
  • 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 and DateTime 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.