Dates

Модуль Dates предоставляет два типа для работы с датами: Date и DateTime, представляющие собой точность в днях и миллисекундах соответственно; оба являются подтипами абстрактного TimeType. Мотивация для различных типов проста: некоторые операции значительно проще, как с точки зрения кода, так и с точки зрения умственного восприятия, когда не нужно иметь дело со сложностями большей точности. Например, поскольку тип 4d61726b646f776e2e436f64652822222c2022446174652229_40726566 разрешает только точность одной даты (т.е. без часов, минут или секунд), обычные соображения по временным зонам, переходу на летнее/зимнее время и високосным секундам становятся ненужными и избегаются.

Оба Date и DateTime по сути являются неизменяемыми обертками Int64. Единственное поле instant любого типа на самом деле является типом UTInstant{P}, который представляет собой непрерывно увеличивающуюся временную шкалу машины, основанную на UT-секунде [1]. Тип 4d61726b646f776e2e436f64652822222c20224461746554696d652229_40726566 не учитывает часовые пояса (naive, в терминах Python), аналогично LocalDateTime в Java 8. Дополнительная функциональность часового пояса может быть добавлена через TimeZones.jl package, который компилирует IANA time zone database. Оба 4d61726b646f776e2e436f64652822222c2022446174652229_40726566 и 4d61726b646f776e2e436f64652822222c20224461746554696d652229_40726566 основаны на стандарте ISO 8601, который следует проективному григорианскому календарю. Одно замечание: стандарт ISO 8601 особенно относится к датам до нашей эры (BC/BCE). В общем, последний день эры до нашей эры (BC/BCE), 31-12-1 до н.э. (BC/BCE), был за ним 1-1-1 н.э. (AD/CE), таким образом, года ноль не существует. Однако стандарт ISO утверждает, что 1 до н.э. (BC/BCE) является годом ноль, так что 0000-12-31 — это день перед 0001-01-01, а год -0001 (да, минус один за год) — это 2 до н.э. (BC/BCE), год -0002 — это 3 до н.э. (BC/BCE) и т.д.

Constructors

Date и DateTime типы могут быть сконструированы из целых чисел или Period типов, путем парсинга или через адаптеры (больше об этом позже):

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 или DateTime парсинг осуществляется с помощью строк формата. Строки формата работают на основе определения разделенных или фиксированной ширины "слотов", которые содержат период для парсинга, и передают текст для парсинга и строку формата в конструктор 4d61726b646f776e2e436f64652822222c2022446174652229_40726566 или 4d61726b646f776e2e436f64652822222c20224461746554696d652229_40726566 в форме Date("2015-01-01",dateformat"y-m-d") или DateTime("20150101",dateformat"yyyymmdd").

Разделенные слоты обозначаются указанием разделителя, который парсер должен ожидать между двумя последующими периодами; таким образом, "y-m-d" дает парсеру знать, что между первым и вторым слотами в строке даты, такой как "2014-07-16", он должен найти символ -. Символы y, m и d сообщают парсеру, какие периоды нужно анализировать в каждом слоте.

Как и в случае с конструкторами выше, такими как Date(2013), разделенные DateFormat позволяют пропускать части дат и времени, при условии, что предыдущие части указаны. Остальные части получают обычные значения по умолчанию. Например, Date("1981-03", dateformat"y-m-d") возвращает 1981-03-01, в то время как Date("31/12", dateformat"d/m/y") дает 0001-12-31. (Обратите внимание, что год по умолчанию - 1 год н.э.) Однако пустая строка всегда вызывает ArgumentError.

Фиксированные слоты задаются повторением символа точки столько раз, сколько соответствует ширине, без разделителей между символами. Таким образом, dateformat"yyyymmdd" будет соответствовать строке даты, такой как "20140716". Парсер различает фиксированный слот по отсутствию разделителя, отмечая переход "yyyymm" от одного символа точки к следующему.

Поддержка парсинга месяцев в текстовом формате также поддерживается через символы u и U, для сокращенных и полных названий месяцев соответственно. По умолчанию поддерживаются только английские названия месяцев, поэтому u соответствует "Jan", "Feb", "Mar" и т.д. А U соответствует "January", "February", "March" и т.д. Подобно другим функциям сопоставления имя=>значение dayname и monthname, пользовательские локали могут быть загружены путем передачи сопоставления locale=>Dict{String,Int} в словари MONTHTOVALUEABBR и MONTHTOVALUE для сокращенных и полных названий месяцев соответственно.

В приведенных выше примерах использовался строковый макрос dateformat"". Этот макрос создает объект DateFormat один раз при расширении макроса и использует тот же объект DateFormat, даже если фрагмент кода выполняется несколько раз.

julia> for i = 1:10^5
           Date("2015-01-01", dateformat"y-m-d")
       end

Или вы можете явно создать объект DateFormat:

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

В качестве альтернативы используйте широковещательную передачу:

julia> years = ["2015", "2016"];

julia> Date.(years, DateFormat("yyyy"))
2-element Vector{Date}:
 2015-01-01
 2016-01-01

Для удобства вы можете передать строку формата напрямую (например, Date("2015-01-01","y-m-d")), хотя эта форма влечет за собой затраты на производительность, если вы многократно разбираете один и тот же формат, так как она внутренне создает новый объект DateFormat каждый раз.

Кроме того, Date или DateTime можно создать из строк с помощью функций parse и tryparse, но с необязательным третьим аргументом типа DateFormat, указывающим формат; например, parse(Date, "06.23.2013", dateformat"m.d.y") или tryparse(DateTime, "1999-12-31T23:59:59"), который использует формат по умолчанию. Основное отличие между функциями заключается в том, что при использовании 4d61726b646f776e2e436f64652822222c202274727970617273652229_40726566 ошибка не возникает, если строка пуста или имеет недопустимый формат; вместо этого возвращается nothing.

Julia 1.9

До Julia 1.9 пустые строки могли передаваться в конструкторы и parse без ошибок, возвращая соответственно DateTime(1), Date(1) или Time(0). Аналогично, tryparse не возвращал nothing.

Полный набор тестов и примеров парсинга и форматирования доступен в stdlib/Dates/test/io.jl.

Durations/Comparisons

Нахождение длины времени между двумя Date или DateTime является простым, учитывая их базовое представление как UTInstant{Day} и UTInstant{Millisecond}, соответственно. Разница между 4d61726b646f776e2e436f64652822222c2022446174652229_40726566 возвращается в количестве Day, а 4d61726b646f776e2e436f64652822222c20224461746554696d652229_40726566 в количестве Millisecond. Аналогично, сравнение TimeType является простой задачей сравнения базовых машинных мгновений (что, в свою очередь, сравнивает внутренние значения 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

Поскольку типы Date и DateTime хранятся как отдельные значения Int64, части или поля даты могут быть извлечены с помощью функций доступа. Функции доступа в нижнем регистре возвращают поле в виде целого числа:

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

Пока propercase возвращает то же значение в соответствующем Period типе:

julia> Dates.Year(t)
2014 years

julia> Dates.Day(t)
31 days

Комплексные методы предоставляются, потому что более эффективно получать доступ к нескольким полям одновременно, чем по отдельности:

julia> Dates.yearmonth(t)
(2014, 1)

julia> Dates.monthday(t)
(1, 31)

julia> Dates.yearmonthday(t)
(2014, 1, 31)

Также можно получить доступ к базовому UTInstant или целочисленному значению:

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

Функции запроса предоставляют календарную информацию о TimeType. Они включают информацию о дне недели:

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

Месяц года:

julia> Dates.monthname(t)
"January"

julia> Dates.daysinmonth(t)
31

Также информация о годе и квартале TimeType:

julia> Dates.isleapyear(t)
false

julia> Dates.dayofyear(t)
31

julia> Dates.quarterofyear(t)
1

julia> Dates.dayofquarter(t)
31

Методы dayname и monthname также могут принимать необязательный ключевое слово locale, которое можно использовать для возврата названия дня или месяца года для других языков/локалей. Существуют также версии этих функций, возвращающие сокращенные названия, а именно dayabbr и monthabbr. Сначала отображение загружается в переменную 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, [""]);

Упомянутые выше функции могут быть использованы для выполнения запросов:

julia> Dates.dayname(t;locale="french")
"vendredi"

julia> Dates.monthname(t;locale="french")
"janvier"

julia> Dates.monthabbr(t;locale="french")
"janv"

Поскольку сокращенные версии дней не загружены, попытка использовать функцию dayabbr вызовет ошибку.

julia> Dates.dayabbr(t;locale="french")
ERROR: BoundsError: attempt to access 1-element Vector{String} at index [5]
Stacktrace:
[...]

TimeType-Period Arithmetic

Хорошей практикой при использовании любого языкового/дата фреймворка является знакомство с тем, как обрабатывается арифметика периодов дат, так как есть некоторые tricky issues, с которыми нужно иметь дело (хотя это гораздо менее актуально для типов с точностью до дня).

Модуль Dates пытается следовать простому принципу, стараясь изменить как можно меньше при выполнении арифметики Period. Этот подход также часто известен как календарная арифметика или то, что вы, вероятно, предположите, если кто-то спросит вас о том же вычислении в разговоре. Почему все это так важно? Давайте рассмотрим классический пример: добавьте 1 месяц к 31 января 2014 года. Каков ответ? Javascript скажет March 3 (предполагает 31 день). PHP скажет March 2 (предполагает 30 дней). Факт в том, что правильного ответа нет. В модуле Dates результатом будет 28 февраля. Как он это вычисляет? Рассмотрите классическую азартную игру 7-7-7 в казино.

Теперь просто представьте, что вместо 7-7-7 слоты — это Год-Месяц-День, или в нашем примере, 2014-01-31. Когда вы просите добавить 1 месяц к этой дате, слот месяца увеличивается, так что теперь у нас 2014-02-31. Затем проверяется номер дня, если он больше последнего действительного дня нового месяца; если это так (как в приведенном выше случае), номер дня корректируется до последнего действительного дня (28). Каковы последствия этого подхода? Продолжайте и добавьте еще один месяц к нашей дате, 2014-02-28 + Month(1) == 2014-03-28. Что? Вы ожидали последний день марта? Нет, извините, помните о слотах 7-7-7. Как можно меньше слотов должно измениться, поэтому мы сначала увеличиваем слот месяца на 1, 2014-03-28, и бум, мы закончили, потому что это действительная дата. С другой стороны, если бы мы добавили 2 месяца к нашей исходной дате, 2014-01-31, то мы бы получили 2014-03-31, как и ожидалось. Другим последствием этого подхода является потеря ассоциативности, когда принудительно устанавливается определенный порядок (т.е. добавление вещей в разном порядке приводит к разным результатам). Например:

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

Что там происходит? В первой строке мы добавляем 1 день к 29 января, что приводит к 2014-01-30; затем мы добавляем 1 месяц, и получаем 2014-02-30, который затем корректируется до 2014-02-28. В втором примере мы сначала добавляем 1 месяц, в результате чего получаем 2014-02-29, который корректируется до 2014-02-28, а затем добавляем 1 день, что приводит к 2014-03-01. Один принцип проектирования, который помогает в этом случае, заключается в том, что при наличии нескольких Периодов операции будут упорядочены по типам Периодов, а не по их значению или порядковому номеру; это означает, что Year всегда будет добавляться первым, затем Month, затем Week и т.д. Таким образом, следующее действительно приводит к ассоциативности и просто работает:

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

Запутанно? Возможно. Что innocent Dates пользователь должен делать? Главное - быть осведомленным о том, что явное принуждение к определенной ассоциативности при работе с месяцами может привести к неожиданным результатам, но в остальном все должно работать как ожидалось. К счастью, это, в общем-то, вся странность в арифметике периодов дат при работе с временем в UT (избегая "радостей" работы с переходом на летнее/зимнее время, високосными секундами и т.д.).

В качестве бонуса все объекты периодической арифметики работают напрямую с диапазонами:

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

Хотя арифметика дат и периодов удобна, часто виды расчетов, необходимых для дат, имеют календарный или темпоральный характер, а не фиксированное количество периодов. Праздники являются отличным примером; большинство из них следуют правилам, таким как "День памяти = Последний понедельник мая" или "День благодарения = 4-й четверг ноября". Такие виды темпоральных выражений имеют дело с правилами, относящимися к календарю, такими как первый или последний день месяца, следующий вторник или первые и третьи среды и т.д.

Модуль Dates предоставляет API регулятора через несколько удобных методов, которые помогают просто и лаконично выражать временные правила. Первая группа методов регулятора касается первого и последнего дней недели, месяца, квартала и года. Каждый из них принимает один TimeType в качестве входных данных и возвращает или регулирует к первому или последнему желаемого периода относительно входных данных.

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

Следующие два метода более высокого порядка, tonext и toprev, обобщают работу с временными выражениями, принимая DateFunction в качестве первого аргумента, вместе с начальным TimeType. DateFunction — это просто функция, обычно анонимная, которая принимает одно 4d61726b646f776e2e436f64652822222c202254696d65547970652229_40726566 в качестве входных данных и возвращает Bool, true, указывающее на удовлетворение критерия корректировки. Например:

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

Это полезно с синтаксисом do-блока для более сложных временных выражений:

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

Метод Base.filter может быть использован для получения всех действительных дат/моментов в указанном диапазоне:

# 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

Дополнительные примеры и тесты доступны в stdlib/Dates/test/adjusters.jl.

Period Types

Периоды — это человеческое восприятие дискретных, иногда нерегулярных промежутков времени. Рассмотрим 1 месяц; он может представлять, в днях, значение 28, 29, 30 или 31 в зависимости от года и контекста месяца. Или год может представлять 365 или 366 дней в случае високосного года. Period типы являются простыми Int64 обертками и создаются путем обертывания любого типа, который можно преобразовать в Int64, т.е. Year(1) или Month(3.0). Арифметика между 4d61726b646f776e2e436f64652822222c2022506572696f642229_40726566 одного типа ведет себя как целые числа, и доступна ограниченная арифметика Period-Real. Вы можете извлечь основное целое число с помощью 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

Представление периодов или длительностей, которые не являются целыми кратными базовым типам, может быть достигнуто с помощью типа Dates.CompoundPeriod. Сложные периоды могут быть сконструированы вручную из простых типов Period. Кроме того, функция canonicalize может быть использована для разбиения периода на 4d61726b646f776e2e436f64652822222c202244617465732e436f6d706f756e64506572696f642229_40726566. Это особенно полезно для преобразования длительности, например, разности двух DateTime, в более удобное представление.

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 и DateTime значения могут быть округлены до заданного разрешения (например, 1 месяц или 15 минут) с floor, ceil или 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

В отличие от числового метода round, который по умолчанию разбивает ничьи в сторону четного числа, метод TimeType4d61726b646f776e2e436f64652822222c2022726f756e642229_40726566 использует режим округления RoundNearestTiesUp. (Трудно угадать, что будет означать разбивка ничьих к ближайшему "четному" 4d61726b646f776e2e436f64652822222c202254696d65547970652229_40726566.) Дополнительные сведения о доступных RoundingMode можно найти в API reference.

Округление должно в целом вести себя ожидаемым образом, но есть несколько случаев, в которых ожидаемое поведение не очевидно.

Rounding Epoch

В многих случаях разрешение, указанное для округления (например, Dates.Second(30)), делится нацело на следующий больший период (в данном случае Dates.Minute(1)). Однако поведение округления в случаях, когда это не так, может привести к путанице. Каков ожидаемый результат округления DateTime до ближайших 10 часов?

julia> round(DateTime(2016, 7, 17, 11, 55), Dates.Hour(10))
2016-07-17T12:00:00

Это может показаться запутанным, учитывая, что час (12) не делится на 10. Причина, по которой была выбрана 2016-07-17T12:00:00, заключается в том, что это 17,676,660 часов после 0000-01-01T00:00:00, и 17,676,660 делится на 10.

Поскольку значения Julia Date и DateTime представлены в соответствии со стандартом ISO 8601, в качестве базовой даты (или "эпохи округления") был выбран 0000-01-01T00:00:00, от которой начинается отсчет дней (и миллисекунд), используемых в расчетах округления. (Обратите внимание, что это немного отличается от внутреннего представления Julia 4d61726b646f776e2e436f64652822222c2022446174652229_40726566, использующего Rata Die notation; но поскольку стандарт ISO 8601 наиболее виден конечному пользователю, в качестве эпохи округления был выбран 0000-01-01T00:00:00, а не 0000-12-31T00:00:00, используемая внутренне, чтобы минимизировать путаницу.)

Единственное исключение из использования 0000-01-01T00:00:00 в качестве эпохи округления — это округление до недель. Округление до ближайшей недели всегда будет возвращать понедельник (первый день недели, как указано в ISO 8601). По этой причине мы используем 0000-01-03T00:00:00 (первый день первой недели года 0000, как определено в ISO 8601) в качестве базы при округлении до количества недель.

Вот связанный случай, в котором ожидаемое поведение не обязательно очевидно: Что происходит, когда мы округляем до ближайшего P(2), где P — это тип Period? В некоторых случаях (в частности, когда P <: Dates.TimePeriod) ответ ясен:

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

Это кажется очевидным, потому что два из каждого из этих периодов все еще делятся на следующий больший период. Но в случае двух месяцев (которые все еще делятся на один год) ответ может быть неожиданным:

julia> round(DateTime(2016, 7, 17, 8, 55, 30), Dates.Month(2))
2016-07-01T00:00:00

Почему округлять до первого дня июля, даже если это месяц 7 (нечетное число)? Ключ в том, что месяцы индексируются с 1 (первому месяцу присваивается 1), в отличие от часов, минут, секунд и миллисекунд (первым из которых присваивается 0).

Это означает, что округление DateTime до четного кратного секунд, минут, часов или лет (поскольку спецификация ISO 8601 включает нулевой год) приведет к 4d61726b646f776e2e436f64652822222c20224461746554696d652229_40726566 с четным значением в этом поле, в то время как округление 4d61726b646f776e2e436f64652822222c20224461746554696d652229_40726566 до четного кратного месяцев приведет к тому, что поле месяцев будет иметь нечетное значение. Поскольку как месяцы, так и годы могут содержать нерегулярное количество дней, неясно, приведет ли округление до четного числа дней к четному значению в поле дней.

Смотрите API reference для получения дополнительной информации о методах, экспортируемых из модуля Dates.

API reference

Dates and Time Types

Dates.PeriodType
Период
Год
Квартал
Месяц
Неделя
День
Час
Минута
Секунда
Миллисекунда
Микросекунда
Наносекунда

Period типы представляют собой дискретные, человеческие представления времени.

source
Dates.CompoundPeriodType
CompoundPeriod

CompoundPeriod полезен для выражения временных периодов, которые не являются фиксированным кратным меньших периодов. Например, "год и день" не является фиксированным числом дней, но может быть выражен с помощью CompoundPeriod. На самом деле, CompoundPeriod автоматически создается при сложении различных типов периодов, например, Year(1) + Day(1) дает результат в виде CompoundPeriod.

source
Dates.InstantType
Мгновение

Instant типы представляют собой целочисленные, машинные представления времени в виде непрерывных временных линий, начинающихся с эпохи.

source
Dates.UTInstantType
UTInstant{T}

UTInstant представляет собой машинную временную шкалу, основанную на времени UT (1 день = одно вращение Земли). T - это параметр Period, который указывает на разрешение или точность момента.

source
Dates.TimeTypeType
TimeType

TimeType типы оборачивают экземпляры Instant машины, чтобы предоставить человеческие представления машинного момента. Time, DateTime и Date являются подтипами TimeType.

source
Dates.DateTimeType
DateTime

DateTime представляет собой момент времени согласно пролептическому григорианскому календарю. Наименьшая разрешающая способность времени — миллисекунда (т.е. микросекунды или наносекунды не могут быть представлены этим типом). Тип поддерживает фиксированную арифметику, и, следовательно, подвержен переполнению (и недостатку). Замечательным следствием является округление при добавлении Microsecond или Nanosecond:

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 округляется до 1000us
2023-08-19T17:45:32.901

julia> dt + Microsecond(1499) # 1499 округляется до 1000us
2023-08-19T17:45:32.901
source
Dates.DateType
Дата

Date оборачивает UTInstant{Day} и интерпретирует его в соответствии с пролептическим григорианским календарем.

source
Dates.TimeType
Время

Time оборачивает Nanosecond и представляет собой конкретный момент в 24-часовом дне.

source
Dates.TimeZoneType
TimeZone

Географическая зона, основанная на долготе, определяющая, какое время в определенном месте. Некоторые часовые пояса переходят на летнее время (например, EST -> EDT). Для реализации и дополнительной поддержки смотрите пакет TimeZones.jl

source
Dates.UTCType
UTC

UTC, или Координированное всемирное время, это TimeZone, от которого измеряются все остальные. Оно связано с временем на 0° долготе. Оно не корректируется для перехода на летнее время.

source

Dates Functions

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

Создайте тип DateTime по частям. Аргументы должны быть преобразуемыми в Int64.

source
Dates.DateTimeMethod
DateTime(periods::Period...) -> DateTime

Создайте тип DateTime из частей типа Period. Аргументы могут быть в любом порядке. Части DateTime, которые не были предоставлены, будут иметь значение Dates.default(period).

source
Dates.DateTimeMethod
DateTime(f::Function, y[, m, d, h, mi, s]; step=Day(1), limit=10000) -> DateTime

Создайте DateTime через API корректировщика. Начальная точка будет построена из предоставленных аргументов y, m, d..., и будет корректироваться до тех пор, пока f::Function не вернет true. Размер шага в корректировке можно указать вручную через ключевое слово step. limit задает предел для максимального количества итераций, которые API корректировки будет выполнять, прежде чем выбросить ошибку (в случае, если f::Function никогда не будет удовлетворен).

Примеры

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: Достигнут предел корректировки: 5 итераций
Stacktrace:
[...]
source
Dates.DateTimeMethod
DateTime(dt::Date) -> DateTime

Преобразует Date в DateTime. Часы, минуты, секунды и миллисекунды новой DateTime предполагаются равными нулю.

source
Dates.DateTimeMethod
DateTime(dt::AbstractString, format::AbstractString; locale="english") -> DateTime

Создайте DateTime, разбирая строку даты и времени dt в соответствии с шаблоном, указанным в строке format (см. DateFormat для синтаксиса).

Note

Этот метод создает объект DateFormat каждый раз, когда он вызывается. Рекомендуется создать объект DateFormat вместо этого и использовать его в качестве второго аргумента, чтобы избежать потери производительности при многократном использовании одного и того же формата.

Примеры

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] # предпочтительно
2-element Vector{DateTime}:
 2020-01-01T00:00:00
 2020-01-02T00:00:00
source
Dates.formatMethod
format(dt::TimeType, format::AbstractString; locale="english") -> AbstractString

Создайте строку, используя объект TimeType и применяя предоставленный format. Следующие коды символов могут быть использованы для создания строки format:

КодПримерыКомментарий
y6Числовой год с фиксированной шириной
Y1996Числовой год с минимальной шириной
m1, 12Числовой месяц с минимальной шириной
uJanНазвание месяца, сокращенное до 3-х символов в соответствии с locale
UJanuaryПолное название месяца в соответствии с ключевым словом locale
d1, 31День месяца с минимальной шириной
H0, 23Час (24-часовой формат) с минимальной шириной
M0, 59Минута с минимальной шириной
S0, 59Секунда с минимальной шириной
s000, 500Миллисекунда с минимальной шириной 3
eMon, TueСокращенные дни недели
EMondayПолное название дня недели

Количество последовательных символов кода указывает на ширину кода. Формат yyyy-mm указывает, что код y должен иметь ширину четыре, а m — ширину два. Коды, которые дают числовые цифры, имеют связанный режим: фиксированная ширина или минимальная ширина. Режим фиксированной ширины добавляет нули слева, когда значение короче указанной ширины, и обрезает значение, когда оно длиннее. Режим минимальной ширины работает так же, как и фиксированная ширина, за исключением того, что он не обрезает значения, которые длиннее ширины.

При создании format вы можете использовать любые не кодовые символы в качестве разделителей. Например, чтобы сгенерировать строку "1996-01-15T00:00:00", вы можете использовать format: "yyyy-mm-ddTHH:MM:SS". Обратите внимание, что если вам нужно использовать символ кода как литерал, вы можете использовать символ экранирования обратный слэш. Строку "1996y01m" можно получить с помощью формата "yyyy\ymm\m".

source
Dates.DateFormatType
DateFormat(format::AbstractString, locale="english") -> DateFormat

Создайте объект форматирования даты, который можно использовать для разбора строк дат или форматирования объекта даты в строку. Следующие коды символов могут быть использованы для создания строки format:

КодСовпаденияКомментарий
Y1996, 96Возвращает год 1996, 0096
y1996, 96То же самое, что и Y при parse, но отбрасывает лишние цифры при format
m1, 01Совпадает с 1- или 2-значными месяцами
uJanСовпадает с сокращенными названиями месяцев в соответствии с ключевым словом locale
UJanuaryСовпадает с полными названиями месяцев в соответствии с ключевым словом locale
d1, 01Совпадает с 1- или 2-значными днями
H00Совпадает с часами (24-часовой формат)
I00Для вывода часов в 12-часовом формате
M00Совпадает с минутами
S00Совпадает с секундами
s.500Совпадает с миллисекундами
eMon, TuesСовпадает с сокращенными названиями дней недели
EMondayСовпадает с полными названиями дней недели
pAMСовпадает с AM/PM (регистр не имеет значения)
yyyymmdd19960101Совпадает с фиксированной шириной года, месяца и дня

Символы, не перечисленные выше, обычно рассматриваются как разделители между датой и временем. Например, строка dt "1996-01-15T00:00:00.0" будет иметь строку format, такую как "y-m-dTH:M:S.s". Если вам нужно использовать код символа в качестве разделителя, вы можете экранировать его с помощью обратной косой черты. Дата "1995y01m" будет иметь формат "y\ym\m".

Обратите внимание, что 12:00AM соответствует 00:00 (полночь), а 12:00PM соответствует 12:00 (полдень). При разборе времени с указателем p любой час (либо H, либо I) интерпретируется как 12-часовой формат, поэтому код I в основном полезен для вывода.

Создание объекта DateFormat дорогостоящее. Когда это возможно, создавайте его один раз и используйте много раз или попробуйте макрос строки dateformat"". Использование этого макроса создает объект DateFormat один раз во время расширения макроса и повторно использует его позже. Также есть несколько предопределенных форматировщиков, перечисленных позже.

Смотрите DateTime и format для того, как использовать объект DateFormat для разбора и записи строк дат соответственно.

source
Dates.@dateformat_strMacro
dateformat"Y-m-d H:M:S"

Создайте объект DateFormat. Похож на DateFormat("Y-m-d H:M:S"), но создает объект DateFormat один раз во время расширения макроса.

Смотрите DateFormat для получения подробной информации о спецификаторах формата.

source
Dates.DateTimeMethod
DateTime(dt::AbstractString, df::DateFormat=ISODateTimeFormat) -> DateTime

Создает DateTime, разбирая строку даты и времени dt в соответствии с шаблоном, указанным в объекте DateFormat, или dateformat"yyyy-mm-dd\THH:MM:SS.s", если он опущен.

Похоже на DateTime(::AbstractString, ::AbstractString), но более эффективно при многократном разборе строк даты и времени с аналогичным форматом с заранее созданным объектом DateFormat.

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

Создайте тип Date по частям. Аргументы должны быть преобразуемыми в Int64.

source
Dates.DateMethod
Date(period::Period...) -> Date

Создайте тип Date из частей типа Period. Аргументы могут быть в любом порядке. Части Date, которые не были предоставлены, будут иметь значение Dates.default(period).

source
Dates.DateMethod
Date(f::Function, y[, m, d]; step=Day(1), limit=10000) -> Date

Создайте Date через API корректировщика. Начальная точка будет построена из предоставленных аргументов y, m, d, и будет корректироваться до тех пор, пока f::Function не вернет true. Размер шага в корректировке можно указать вручную через ключевое слово step. limit задает предел максимального количества итераций, которые API корректировки будет выполнять, прежде чем выбросить ошибку (при условии, что f::Function никогда не будет удовлетворен).

Примеры

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: Достигнут предел корректировки: 5 итераций
Stacktrace:
[...]
source
Dates.DateMethod
Date(dt::DateTime) -> Date

Преобразует DateTime в Date. Часы, минуты, секунды и миллисекунды части DateTime отбрасываются, поэтому в конструировании используются только части года, месяца и дня.

source
Dates.DateMethod
Date(d::AbstractString, format::AbstractString; locale="english") -> Date

Создайте Date, разбирая строку даты d в соответствии с шаблоном, указанным в строке format (см. DateFormat для синтаксиса).

Note

Этот метод создает объект DateFormat каждый раз, когда он вызывается. Рекомендуется создать объект DateFormat вместо этого и использовать его в качестве второго аргумента, чтобы избежать потери производительности при многократном использовании одного и того же формата.

Примеры

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] # предпочтительно
2-element Vector{Date}:
 2020-01-01
 2020-01-02
source
Dates.DateMethod
Date(d::AbstractString, df::DateFormat=ISODateFormat) -> Date

Создает объект Date, разбирая строку даты d в соответствии с шаблоном, указанным в объекте DateFormat, или dateformat"yyyy-mm-dd", если он опущен.

Похоже на Date(::AbstractString, ::AbstractString), но более эффективно при многократном разборе строк дат с аналогичным форматом с заранее созданным объектом DateFormat.

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

Создайте тип Time по частям. Аргументы должны быть преобразуемыми в Int64.

source
Dates.TimeMethod
Time(period::TimePeriod...) -> Time

Создайте тип Time из частей типа Period. Аргументы могут быть в любом порядке. Части Time, которые не были предоставлены, будут иметь значение по умолчанию 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)

Создайте Time через API корректировщика. Начальная точка будет построена из предоставленных аргументов h, mi, s, ms, us и будет корректироваться до тех пор, пока f::Function не вернет true. Размер шага в корректировке можно указать вручную через ключевое слово step. limit задает предел максимального количества итераций, которые API корректировки будет выполнять, прежде чем выбросить ошибку (в случае, если f::Function никогда не будет удовлетворен). Обратите внимание, что шаг по умолчанию будет корректироваться для обеспечения большей точности для заданных аргументов; т.е. если предоставлены аргументы часа, минуты и секунды, шаг по умолчанию будет Millisecond(1), а не Second(1).

Примеры

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: Достигнут предел корректировки: 5 итераций
Stacktrace:
[...]
source
Dates.TimeMethod
Time(dt::DateTime) -> Time

Преобразует DateTime в Time. Час, минута, секунда и миллисекунда из DateTime используются для создания нового Time. Микросекунды и наносекунды по умолчанию равны нулю.

source
Dates.TimeMethod
Time(t::AbstractString, format::AbstractString; locale="english") -> Time

Создайте Time, разбирая строку времени t в соответствии с шаблоном, указанным в строке format (см. DateFormat для синтаксиса).

Note

Этот метод создает объект DateFormat каждый раз, когда он вызывается. Рекомендуется создать объект DateFormat вместо этого и использовать его в качестве второго аргумента, чтобы избежать потери производительности при многократном использовании одного и того же формата.

Примеры

julia> Time("12:34pm", "HH:MMp")
12:34:00

julia> a = ("12:34pm", "2:34am");

julia> [Time(d, dateformat"HH:MMp") for d ∈ a] # предпочтительно
2-element Vector{Time}:
 12:34:00
 02:34:00
source
Dates.TimeMethod
Time(t::AbstractString, df::DateFormat=ISOTimeFormat) -> Time

Создает Time, разбирая строку даты и времени t в соответствии с шаблоном, указанным в объекте DateFormat, или dateformat"HH:MM:SS.s", если он опущен.

Похоже на Time(::AbstractString, ::AbstractString), но более эффективно при многократном разборе строк времени с аналогичным форматом с заранее созданным объектом DateFormat.

source
Dates.nowMethod
now() -> DateTime

Возвращает DateTime, соответствующий системному времени пользователя, включая локаль часового пояса системы.

source
Dates.nowMethod
now(::Type{UTC}) -> DateTime

Возвращает DateTime, соответствующий системному времени пользователя в UTC/GMT. Для других часовых поясов смотрите пакет TimeZones.jl.

Примеры

julia> now(UTC)
2023-01-04T10:52:24.864
source
Base.epsMethod
eps(::Type{DateTime}) -> Millisecond
eps(::Type{Date}) -> Day
eps(::Type{Time}) -> Nanosecond
eps(::TimeType) -> Period

Возвращает наименьшее значение единицы, поддерживаемое TimeType.

Примеры

julia> eps(DateTime)
1 миллисекунда

julia> eps(Date)
1 день

julia> eps(Time)
1 наносекунда
source

Accessor Functions

Dates.weekFunction
week(dt::TimeType) -> Int64

Возвращает ISO неделю даты для Date или DateTime в виде Int64. Обратите внимание, что первая неделя года — это неделя, которая содержит первый четверг года, что может привести к тому, что даты до 4 января будут относиться к последней неделе предыдущего года. Например, week(Date(2005, 1, 1)) — это 53-я неделя 2004 года.

Примеры

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

День месяца Date или DateTime в виде Int64.

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

Час дня для DateTime в виде Int64.

source
hour(t::Time) -> Int64

Час Time в виде Int64.

source
Dates.secondFunction
second(dt::DateTime) -> Int64

Секунда DateTime в виде Int64.

source
second(t::Time) -> Int64

Секунда Time в виде Int64.

source
Dates.millisecondFunction
millisecond(dt::DateTime) -> Int64

Миллисекунда DateTime в виде Int64.

source
millisecond(t::Time) -> Int64

Миллисекунда Time в виде Int64.

source
Dates.YearMethod
Year(v)

Создайте объект Year с заданным значением v. Входные данные должны быть без потерь преобразуемы в Int64.

source
Dates.MonthMethod
Month(v)

Создайте объект Month с заданным значением v. Входные данные должны быть без потерь преобразуемы в Int64.

source
Dates.WeekMethod
Week(v)

Создайте объект Week с заданным значением v. Входные данные должны быть без потерь преобразуемы в Int64.

source
Dates.DayMethod
Day(v)

Создайте объект Day с заданным значением v. Входные данные должны быть без потерь преобразуемы в Int64.

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

Часовая часть DateTime в виде Hour.

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

Минутная часть DateTime в виде Minute.

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

Вторая часть DateTime в виде Second.

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

Миллисекундная часть DateTime в виде Millisecond.

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

Микросекундная часть времени в виде Microsecond.

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

Наносекунда части времени как Nanosecond.

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

Одновременно возвращает год и месяц из Date или DateTime.

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

Одновременно возвращает месяц и день части Date или DateTime.

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

Одновременно возвращает год, месяц и день части Date или DateTime.

source

Query Functions

Dates.daynameFunction
dayname(dt::TimeType; locale="русский") -> String
dayname(day::Integer; locale="русский") -> String

Возвращает полное название дня недели, соответствующее дате Date или DateTime в заданной locale. Также принимает Integer.

Примеры

julia> dayname(Date("2000-01-01"))
"Суббота"

julia> dayname(4)
"Четверг"
source
Dates.dayabbrFunction
dayabbr(dt::TimeType; locale="русский") -> String
dayabbr(day::Integer; locale="русский") -> String

Возвращает сокращенное название, соответствующее дню недели для Date или DateTime в заданной locale. Также принимает Integer.

Примеры

julia> dayabbr(Date("2000-01-01"))
"Сб"

julia> dayabbr(3)
"Ср"
source
Dates.dayofweekFunction
dayofweek(dt::TimeType) -> Int64

Возвращает день недели в виде Int64 с 1 = Понедельник, 2 = Вторник и т.д..

Примеры

julia> dayofweek(Date("2000-01-01"))
6
source
Dates.dayofmonthFunction
dayofmonth(dt::TimeType) -> Int64

День месяца для Date или DateTime в виде Int64.

source
Dates.dayofweekofmonthFunction
dayofweekofmonth(dt::TimeType) -> Int

Для дня недели dt верните, какой номер он имеет в месяце dt. Таким образом, если день недели dt - понедельник, то 1 = Первый понедельник месяца, 2 = Второй понедельник месяца и т.д. В диапазоне 1:5.

Примеры

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

Для дня недели dt верните общее количество этого дня недели в месяце dt. Возвращает 4 или 5. Полезно в временных выражениях для указания последнего дня недели в месяце, включая dayofweekofmonth(dt) == daysofweekinmonth(dt) в функции корректировки.

Примеры

julia> daysofweekinmonth(Date("2005-01-01"))
5

julia> daysofweekinmonth(Date("2005-01-04"))
4
source
Dates.monthnameFunction
monthname(dt::TimeType; locale="русский") -> String
monthname(month::Integer, locale="русский") -> String

Возвращает полное название месяца для Date или DateTime или Integer в указанной locale.

Примеры

julia> monthname(Date("2005-01-04"))
"Январь"

julia> monthname(2)
"Февраль"
source
Dates.monthabbrFunction
monthabbr(dt::TimeType; locale="русский") -> String
monthabbr(month::Integer, locale="русский") -> String

Возвращает сокращенное название месяца для Date или DateTime или Integer в указанной locale.

Примеры

julia> monthabbr(Date("2005-01-04"))
"Янв"

julia> monthabbr(2)
"Фев"
source
Dates.daysinmonthFunction
daysinmonth(dt::TimeType) -> Int

Возвращает количество дней в месяце dt. Значение будет 28, 29, 30 или 31.

Примеры

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

Возвращает true, если год dt является високосным.

Примеры

julia> isleapyear(Date("2004"))
true

julia> isleapyear(Date("2005"))
false
source
Dates.dayofyearFunction
dayofyear(dt::TimeType) -> Int

Возвращает день года для dt, при этом 1 января является днем 1.

source
Dates.daysinyearFunction
daysinyear(dt::TimeType) -> Int

Вернуть 366, если год dt является високосным, в противном случае вернуть 365.

Примеры

julia> daysinyear(1999)
365

julia> daysinyear(2000)
366
source
Dates.quarterofyearFunction
quarterofyear(dt::TimeType) -> Int

Возвращает квартал, в котором находится dt. Диапазон значений от 1 до 4.

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

Возвращает день текущего квартала dt. Диапазон значений от 1 до 92.

source

Adjuster Functions

Base.truncMethod
trunc(dt::TimeType, ::Type{Period}) -> TimeType

Обрезает значение dt в соответствии с предоставленным типом Period.

Примеры

julia> trunc(DateTime("1996-01-01T12:30:00"), Day)
1996-01-01T00:00:00
source
Dates.firstdayofweekFunction
firstdayofweek(dt::TimeType) -> TimeType

Корректирует dt на понедельник его недели.

Примеры

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

Корректирует dt на воскресенье его недели.

Примеры

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

Настраивает dt на первый день его месяца.

Примеры

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

Корректирует dt на последний день его месяца.

Примеры

julia> lastdayofmonth(DateTime("1996-05-20"))
1996-05-31T00:00:00
source
Dates.firstdayofyearFunction
firstdayofyear(dt::TimeType) -> TimeType

Корректирует dt на первый день его года.

Примеры

julia> firstdayofyear(DateTime("1996-05-20"))
1996-01-01T00:00:00
source
Dates.lastdayofyearFunction
lastdayofyear(dt::TimeType) -> TimeType

Корректирует dt на последний день его года.

Примеры

julia> lastdayofyear(DateTime("1996-05-20"))
1996-12-31T00:00:00
source
Dates.firstdayofquarterFunction
firstdayofquarter(dt::TimeType) -> TimeType

Корректирует dt на первый день его квартала.

Примеры

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

Корректирует dt на последний день его квартала.

Примеры

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

Корректирует dt на следующий день недели, соответствующий dow, где 1 = понедельник, 2 = вторник и т.д. Установка same=true позволяет считать текущее dt следующим dow, что позволяет избежать корректировки.

source
Dates.toprevMethod
toprev(dt::TimeType, dow::Int; same::Bool=false) -> TimeType

Корректирует dt на предыдущий день недели, соответствующий dow, где 1 = понедельник, 2 = вторник и т.д. Установка same=true позволяет считать текущее dt предыдущим dow, что позволяет избежать корректировки.

source
Dates.tofirstFunction
tofirst(dt::TimeType, dow::Int; of=Month) -> TimeType

Настраивает dt на первый dow его месяца. В качестве альтернативы, of=Year настроит на первый dow года.

source
Dates.tolastFunction
tolast(dt::TimeType, dow::Int; of=Month) -> TimeType

Корректирует dt на последний dow его месяца. В качестве альтернативы, of=Year скорректирует на последний dow года.

source
Dates.tonextMethod
tonext(func::Function, dt::TimeType; step=Day(1), limit=10000, same=false) -> TimeType

Корректирует dt, выполняя не более limit итераций с увеличением на step, пока func не вернет true. func должен принимать один аргумент типа TimeType и возвращать Bool. Параметр same позволяет учитывать dt при удовлетворении func.

source
Dates.toprevMethod
toprev(func::Function, dt::TimeType; step=Day(-1), limit=10000, same=false) -> TimeType

Корректирует dt, выполняя не более limit итераций с увеличением step, пока func не вернет true. func должен принимать один аргумент типа TimeType и возвращать Bool. Параметр same позволяет учитывать dt при выполнении условия func.

source

Periods

Dates.PeriodMethod
Год(v)
Квартал(v)
Месяц(v)
Неделя(v)
День(v)
Час(v)
Минута(v)
Секунда(v)
Миллисекунда(v)
Микросекунда(v)
Наносекунда(v)

Создайте тип Period с заданным значением v. Входные данные должны быть без потерь преобразуемы в Int64.

source
Dates.CompoundPeriodMethod
CompoundPeriod(periods) -> CompoundPeriod

Создает CompoundPeriod из Vector периодов Period. Все Period одного типа будут сложены вместе.

Примеры

julia> Dates.CompoundPeriod(Dates.Hour(12), Dates.Hour(13))
25 часов

julia> Dates.CompoundPeriod(Dates.Hour(-1), Dates.Minute(1))
-1 час, 1 минута

julia> Dates.CompoundPeriod(Dates.Month(1), Dates.Week(-2))
1 месяц, -2 недели

julia> Dates.CompoundPeriod(Dates.Minute(50000))
50000 минут
source
Dates.canonicalizeFunction
canonicalize(::CompoundPeriod) -> CompoundPeriod

Снижает CompoundPeriod до его канонической формы, применяя следующие правила:

  • Любой Period, который достаточно велик, чтобы частично представляться более грубым Period, будет разбит на несколько Period (например, Hour(30) становится Day(1) + Hour(6))
  • Period с противоположными знаками будут объединены, когда это возможно (например, Hour(1) - Day(1) становится -Hour(23))

Примеры

julia> canonicalize(Dates.CompoundPeriod(Dates.Hour(12), Dates.Hour(13)))
1 день, 1 час

julia> canonicalize(Dates.CompoundPeriod(Dates.Hour(-1), Dates.Minute(1)))
-59 минут

julia> canonicalize(Dates.CompoundPeriod(Dates.Month(1), Dates.Week(-2)))
1 месяц, -2 недели

julia> canonicalize(Dates.CompoundPeriod(Dates.Minute(50000)))
4 недели, 6 дней, 17 часов, 20 минут
source
Dates.valueFunction
Dates.value(x::Period) -> Int64

Для данного периода верните значение, связанное с этим периодом. Например, value(Millisecond(10)) возвращает 10 как целое число.

source
Dates.defaultFunction
default(p::Period) -> Period

Вернуть разумное "значение по умолчанию" для входного периода, возвращая T(1) для Года, Месяца и Дня, и T(0) для Часа, Минуты, Секунды и Миллисекунды.

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

Возвращает Vector периодов Period, которые составляют данный CompoundPeriod.

Julia 1.7

Эта функция требует Julia 1.7 или более поздней версии.

source

Rounding Functions

Значения Date и DateTime могут быть округлены до заданного разрешения (например, 1 месяц или 15 минут) с помощью floor, ceil или round.

Base.floorMethod
floor(dt::TimeType, p::Period) -> TimeType

Возвращает ближайшую Date или DateTime, меньшую или равную dt с разрешением p.

Для удобства p может быть типом вместо значения: floor(dt, Dates.Hour) является сокращением для 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

Возвращает ближайшую Date или DateTime, большую или равную dt с разрешением p.

Для удобства p может быть типом вместо значения: ceil(dt, Dates.Hour) является сокращением для 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

Возвращает Date или DateTime, ближайший к dt с разрешением p. По умолчанию (RoundNearestTiesUp) связи (например, округление 9:30 до ближайшего часа) будут округлены вверх.

Для удобства p может быть типом вместо значения: round(dt, Dates.Hour) является сокращением для 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

Допустимые режимы округления для round(::TimeType, ::Period, ::RoundingMode) это RoundNearestTiesUp (по умолчанию), RoundDown (floor) и RoundUp (ceil).

source

Большинство значений Period также можно округлить до заданного разрешения:

Base.floorMethod
floor(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> T

Округляет x вниз до ближайшего кратного precision. Если x и precision являются разными подтипами Period, возвращаемое значение будет иметь тот же тип, что и precision.

Для удобства precision может быть типом вместо значения: floor(x, Dates.Hour) является сокращением для floor(x, Dates.Hour(1)).

julia> floor(Day(16), Week)
2 недели

julia> floor(Minute(44), Minute(15))
30 минут

julia> floor(Hour(36), Day)
1 день

Округление до precision в виде Month или Year не поддерживается, так как эти Period имеют непостоянную длину.

source
Base.ceilMethod
ceil(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> T

Округлите x вверх до ближайшего кратного precision. Если x и precision являются разными подтипами Period, возвращаемое значение будет иметь тот же тип, что и precision.

Для удобства precision может быть типом, а не значением: ceil(x, Dates.Hour) является сокращением для 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

Округление до precision в виде Month или Year не поддерживается, так как эти Period имеют непостоянную длину.

source
Base.roundMethod
round(x::Period, precision::T, [r::RoundingMode]) where T <: Union{TimePeriod, Week, Day} -> T

Округляет x до ближайшего кратного precision. Если x и precision являются разными подтипами Period, возвращаемое значение будет иметь тот же тип, что и precision. По умолчанию (RoundNearestTiesUp) связи (например, округление 90 минут до ближайшего часа) будут округлены вверх.

Для удобства precision может быть типом вместо значения: round(x, Dates.Hour) является сокращением для 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

Допустимые режимы округления для round(::Period, ::T, ::RoundingMode) это RoundNearestTiesUp (по умолчанию), RoundDown (floor) и RoundUp (ceil).

Округление до precision в виде Months или Years не поддерживается, так как эти Periods имеют непостоянную длину.

source

Следующие функции не экспортируются:

Dates.floorceilFunction
floorceil(dt::TimeType, p::Period) -> (TimeType, TimeType)

Одновременно возвращает floor и ceil для Date или DateTime с разрешением p. Более эффективно, чем вызов floor и ceil по отдельности.

source
floorceil(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> (T, T)

Одновременно возвращает floor и ceil для Period с разрешением p. Более эффективно, чем вызов floor и ceil по отдельности.

source
Dates.epochdays2dateFunction
epochdays2date(days) -> Date

Возьмите количество дней с момента округления эпохи (0000-01-01T00:00:00) и верните соответствующую Date.

source
Dates.epochms2datetimeFunction
epochms2datetime(milliseconds) -> DateTime

Возьмите количество миллисекунд с момента округления эпохи (0000-01-01T00:00:00) и верните соответствующий DateTime.

source
Dates.date2epochdaysFunction
date2epochdays(dt::Date) -> Int64

Возвращает количество дней с момента округления эпохи (0000-01-01T00:00:00) для данного Date в виде Int64.

source
Dates.datetime2epochmsFunction
datetime2epochms(dt::DateTime) -> Int64

Возьмите данный DateTime и верните количество миллисекунд с момента начала эпохи (0000-01-01T00:00:00) в виде Int64.

source

Conversion Functions

Dates.todayFunction
today() -> Date

Возвращает дату из now().

source
Dates.unix2datetimeFunction
unix2datetime(x) -> DateTime

Возьмите количество секунд с момента начала эпохи Unix 1970-01-01T00:00:00 и преобразуйте в соответствующий DateTime.

source
Dates.datetime2unixFunction
datetime2unix(dt::DateTime) -> Float64

Возвращает количество секунд с начала эпохи Unix 1970-01-01T00:00:00 для данного DateTime в виде Float64.

source
Dates.julian2datetimeFunction
julian2datetime(julian_days) -> DateTime

Возьмите количество дней юлианского календаря с начала эпохи -4713-11-24T12:00:00 и верните соответствующий DateTime.

source
Dates.datetime2julianFunction
datetime2julian(dt::DateTime) -> Float64

Возьмите данный DateTime и верните количество дней юлианского календаря с юлианской эпохи -4713-11-24T12:00:00 в виде Float64.

source
Dates.rata2datetimeFunction
rata2datetime(days) -> DateTime

Возьмите количество дней Rata Die с начала эпохи 0000-12-31T00:00:00 и верните соответствующий DateTime.

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

Возвращает количество дней Rata Die с начала эпохи для данного Date или DateTime.

source

Constants

Дни недели:

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

Месяцы года:

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

Common Date Formatters

Dates.ISODateTimeFormatConstant
Dates.ISODateTimeFormat

Описывает форматирование ISO8601 для даты и времени. Это значение по умолчанию для Dates.format объекта DateTime.

Примеры

julia> Dates.format(DateTime(2018, 8, 8, 12, 0, 43, 1), ISODateTimeFormat)
"2018-08-08T12:00:43.001"
source
Dates.ISODateFormatConstant
Dates.ISODateFormat

Описывает форматирование ISO8601 для даты. Это значение по умолчанию для Dates.format объекта Date.

Примеры

julia> Dates.format(Date(2018, 8, 8), ISODateFormat)
"2018-08-08"
source
Dates.ISOTimeFormatConstant
Dates.ISOTimeFormat

Описывает форматирование ISO8601 для времени. Это значение по умолчанию для Dates.format объекта Time.

Примеры

julia> Dates.format(Time(12, 0, 43, 1), ISOTimeFormat)
"12:00:43.001"
source
Dates.RFC1123FormatConstant
Dates.RFC1123Format

Описывает форматирование RFC1123 для даты и времени.

Примеры

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.