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-01Date или 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 пустые строки могли передаваться в конструкторы и 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 millisecondsAccessor 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)
735264Query 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-29Adjuster 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 minutesRounding
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.Period — TypeПериод
Год
Квартал
Месяц
Неделя
День
Час
Минута
Секунда
Миллисекунда
Микросекунда
НаносекундаPeriod типы представляют собой дискретные, человеческие представления времени.
Dates.CompoundPeriod — TypeCompoundPeriodCompoundPeriod полезен для выражения временных периодов, которые не являются фиксированным кратным меньших периодов. Например, "год и день" не является фиксированным числом дней, но может быть выражен с помощью CompoundPeriod. На самом деле, CompoundPeriod автоматически создается при сложении различных типов периодов, например, Year(1) + Day(1) дает результат в виде CompoundPeriod.
Dates.Instant — TypeМгновениеInstant типы представляют собой целочисленные, машинные представления времени в виде непрерывных временных линий, начинающихся с эпохи.
Dates.UTInstant — TypeUTInstant{T}UTInstant представляет собой машинную временную шкалу, основанную на времени UT (1 день = одно вращение Земли). T - это параметр Period, который указывает на разрешение или точность момента.
Dates.TimeType — TypeTimeTypeTimeType типы оборачивают экземпляры Instant машины, чтобы предоставить человеческие представления машинного момента. Time, DateTime и Date являются подтипами TimeType.
Dates.DateTime — TypeDateTimeDateTime представляет собой момент времени согласно пролептическому григорианскому календарю. Наименьшая разрешающая способность времени — миллисекунда (т.е. микросекунды или наносекунды не могут быть представлены этим типом). Тип поддерживает фиксированную арифметику, и, следовательно, подвержен переполнению (и недостатку). Замечательным следствием является округление при добавлении 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.901Dates.Date — TypeДатаDate оборачивает UTInstant{Day} и интерпретирует его в соответствии с пролептическим григорианским календарем.
Dates.Time — TypeВремяTime оборачивает Nanosecond и представляет собой конкретный момент в 24-часовом дне.
Dates.TimeZone — TypeTimeZoneГеографическая зона, основанная на долготе, определяющая, какое время в определенном месте. Некоторые часовые пояса переходят на летнее время (например, EST -> EDT). Для реализации и дополнительной поддержки смотрите пакет TimeZones.jl
Dates.UTC — TypeUTCUTC, или Координированное всемирное время, это TimeZone, от которого измеряются все остальные. Оно связано с временем на 0° долготе. Оно не корректируется для перехода на летнее время.
Dates Functions
Dates.DateTime — MethodDateTime(y, [m, d, h, mi, s, ms]) -> DateTimeСоздайте тип DateTime по частям. Аргументы должны быть преобразуемыми в Int64.
Dates.DateTime — MethodDateTime(periods::Period...) -> DateTimeСоздайте тип DateTime из частей типа Period. Аргументы могут быть в любом порядке. Части DateTime, которые не были предоставлены, будут иметь значение Dates.default(period).
Dates.DateTime — MethodDateTime(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:
[...]Dates.DateTime — MethodDateTime(dt::Date) -> DateTimeПреобразует Date в DateTime. Часы, минуты, секунды и миллисекунды новой DateTime предполагаются равными нулю.
Dates.DateTime — MethodDateTime(dt::AbstractString, format::AbstractString; locale="english") -> DateTimeСоздайте DateTime, разбирая строку даты и времени dt в соответствии с шаблоном, указанным в строке format (см. DateFormat для синтаксиса).
Этот метод создает объект 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:00Dates.format — Methodformat(dt::TimeType, format::AbstractString; locale="english") -> AbstractStringСоздайте строку, используя объект TimeType и применяя предоставленный format. Следующие коды символов могут быть использованы для создания строки format:
| Код | Примеры | Комментарий |
|---|---|---|
y | 6 | Числовой год с фиксированной шириной |
Y | 1996 | Числовой год с минимальной шириной |
m | 1, 12 | Числовой месяц с минимальной шириной |
u | Jan | Название месяца, сокращенное до 3-х символов в соответствии с locale |
U | January | Полное название месяца в соответствии с ключевым словом locale |
d | 1, 31 | День месяца с минимальной шириной |
H | 0, 23 | Час (24-часовой формат) с минимальной шириной |
M | 0, 59 | Минута с минимальной шириной |
S | 0, 59 | Секунда с минимальной шириной |
s | 000, 500 | Миллисекунда с минимальной шириной 3 |
e | Mon, Tue | Сокращенные дни недели |
E | Monday | Полное название дня недели |
Количество последовательных символов кода указывает на ширину кода. Формат yyyy-mm указывает, что код y должен иметь ширину четыре, а m — ширину два. Коды, которые дают числовые цифры, имеют связанный режим: фиксированная ширина или минимальная ширина. Режим фиксированной ширины добавляет нули слева, когда значение короче указанной ширины, и обрезает значение, когда оно длиннее. Режим минимальной ширины работает так же, как и фиксированная ширина, за исключением того, что он не обрезает значения, которые длиннее ширины.
При создании format вы можете использовать любые не кодовые символы в качестве разделителей. Например, чтобы сгенерировать строку "1996-01-15T00:00:00", вы можете использовать format: "yyyy-mm-ddTHH:MM:SS". Обратите внимание, что если вам нужно использовать символ кода как литерал, вы можете использовать символ экранирования обратный слэш. Строку "1996y01m" можно получить с помощью формата "yyyy\ymm\m".
Dates.DateFormat — TypeDateFormat(format::AbstractString, locale="english") -> DateFormatСоздайте объект форматирования даты, который можно использовать для разбора строк дат или форматирования объекта даты в строку. Следующие коды символов могут быть использованы для создания строки format:
| Код | Совпадения | Комментарий |
|---|---|---|
Y | 1996, 96 | Возвращает год 1996, 0096 |
y | 1996, 96 | То же самое, что и Y при parse, но отбрасывает лишние цифры при format |
m | 1, 01 | Совпадает с 1- или 2-значными месяцами |
u | Jan | Совпадает с сокращенными названиями месяцев в соответствии с ключевым словом locale |
U | January | Совпадает с полными названиями месяцев в соответствии с ключевым словом locale |
d | 1, 01 | Совпадает с 1- или 2-значными днями |
H | 00 | Совпадает с часами (24-часовой формат) |
I | 00 | Для вывода часов в 12-часовом формате |
M | 00 | Совпадает с минутами |
S | 00 | Совпадает с секундами |
s | .500 | Совпадает с миллисекундами |
e | Mon, Tues | Совпадает с сокращенными названиями дней недели |
E | Monday | Совпадает с полными названиями дней недели |
p | AM | Совпадает с AM/PM (регистр не имеет значения) |
yyyymmdd | 19960101 | Совпадает с фиксированной шириной года, месяца и дня |
Символы, не перечисленные выше, обычно рассматриваются как разделители между датой и временем. Например, строка 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 для разбора и записи строк дат соответственно.
Dates.@dateformat_str — Macrodateformat"Y-m-d H:M:S"Создайте объект DateFormat. Похож на DateFormat("Y-m-d H:M:S"), но создает объект DateFormat один раз во время расширения макроса.
Смотрите DateFormat для получения подробной информации о спецификаторах формата.
Dates.DateTime — MethodDateTime(dt::AbstractString, df::DateFormat=ISODateTimeFormat) -> DateTimeСоздает DateTime, разбирая строку даты и времени dt в соответствии с шаблоном, указанным в объекте DateFormat, или dateformat"yyyy-mm-dd\THH:MM:SS.s", если он опущен.
Похоже на DateTime(::AbstractString, ::AbstractString), но более эффективно при многократном разборе строк даты и времени с аналогичным форматом с заранее созданным объектом DateFormat.
Dates.Date — MethodDate(y, [m, d]) -> DateСоздайте тип Date по частям. Аргументы должны быть преобразуемыми в Int64.
Dates.Date — MethodDate(period::Period...) -> DateСоздайте тип Date из частей типа Period. Аргументы могут быть в любом порядке. Части Date, которые не были предоставлены, будут иметь значение Dates.default(period).
Dates.Date — MethodDate(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:
[...]Dates.Date — MethodDate(dt::DateTime) -> DateПреобразует DateTime в Date. Часы, минуты, секунды и миллисекунды части DateTime отбрасываются, поэтому в конструировании используются только части года, месяца и дня.
Dates.Date — MethodDate(d::AbstractString, format::AbstractString; locale="english") -> DateСоздайте Date, разбирая строку даты d в соответствии с шаблоном, указанным в строке format (см. DateFormat для синтаксиса).
Этот метод создает объект 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-02Dates.Date — MethodDate(d::AbstractString, df::DateFormat=ISODateFormat) -> DateСоздает объект Date, разбирая строку даты d в соответствии с шаблоном, указанным в объекте DateFormat, или dateformat"yyyy-mm-dd", если он опущен.
Похоже на Date(::AbstractString, ::AbstractString), но более эффективно при многократном разборе строк дат с аналогичным форматом с заранее созданным объектом DateFormat.
Dates.Time — MethodTime(h, [mi, s, ms, us, ns]) -> TimeСоздайте тип Time по частям. Аргументы должны быть преобразуемыми в Int64.
Dates.Time — MethodTime(period::TimePeriod...) -> TimeСоздайте тип Time из частей типа Period. Аргументы могут быть в любом порядке. Части Time, которые не были предоставлены, будут иметь значение по умолчанию Dates.default(period).
Dates.Time — MethodTime(f::Function, h, mi=0; step::Period=Second(1), limit::Int=10000)
Time(f::Function, h, mi, s; step::Period=Millisecond(1), limit::Int=10000)
Time(f::Function, h, mi, s, ms; step::Period=Microsecond(1), limit::Int=10000)
Time(f::Function, h, mi, s, ms, us; step::Period=Nanosecond(1), limit::Int=10000)Создайте 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:
[...]Dates.Time — MethodTime(dt::DateTime) -> TimeПреобразует DateTime в Time. Час, минута, секунда и миллисекунда из DateTime используются для создания нового Time. Микросекунды и наносекунды по умолчанию равны нулю.
Dates.Time — MethodTime(t::AbstractString, format::AbstractString; locale="english") -> TimeСоздайте Time, разбирая строку времени t в соответствии с шаблоном, указанным в строке format (см. DateFormat для синтаксиса).
Этот метод создает объект 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:00Dates.Time — MethodTime(t::AbstractString, df::DateFormat=ISOTimeFormat) -> TimeСоздает Time, разбирая строку даты и времени t в соответствии с шаблоном, указанным в объекте DateFormat, или dateformat"HH:MM:SS.s", если он опущен.
Похоже на Time(::AbstractString, ::AbstractString), но более эффективно при многократном разборе строк времени с аналогичным форматом с заранее созданным объектом DateFormat.
Dates.now — Methodnow() -> DateTimeВозвращает DateTime, соответствующий системному времени пользователя, включая локаль часового пояса системы.
Dates.now — Methodnow(::Type{UTC}) -> DateTimeВозвращает DateTime, соответствующий системному времени пользователя в UTC/GMT. Для других часовых поясов смотрите пакет TimeZones.jl.
Примеры
julia> now(UTC)
2023-01-04T10:52:24.864Base.eps — Methodeps(::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 наносекундаAccessor Functions
Dates.year — Functionyear(dt::TimeType) -> Int64Год Date или DateTime в виде Int64.
Dates.month — Functionmonth(dt::TimeType) -> Int64Месяц Date или DateTime в виде Int64.
Dates.week — Functionweek(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))
53Dates.day — Functionday(dt::TimeType) -> Int64День месяца Date или DateTime в виде Int64.
Dates.hour — Functionhour(dt::DateTime) -> Int64Час дня для DateTime в виде Int64.
hour(t::Time) -> Int64Час Time в виде Int64.
Dates.minute — Functionminute(dt::DateTime) -> Int64Минута DateTime в виде Int64.
minute(t::Time) -> Int64Минута Time в виде Int64.
Dates.second — Functionsecond(dt::DateTime) -> Int64Секунда DateTime в виде Int64.
second(t::Time) -> Int64Секунда Time в виде Int64.
Dates.millisecond — Functionmillisecond(dt::DateTime) -> Int64Миллисекунда DateTime в виде Int64.
millisecond(t::Time) -> Int64Миллисекунда Time в виде Int64.
Dates.microsecond — Functionmicrosecond(t::Time) -> Int64Микросекунда Time в виде Int64.
Dates.nanosecond — Functionnanosecond(t::Time) -> Int64Наносекунда времени Time в виде Int64.
Dates.Year — MethodYear(v)Создайте объект Year с заданным значением v. Входные данные должны быть без потерь преобразуемы в Int64.
Dates.Month — MethodMonth(v)Создайте объект Month с заданным значением v. Входные данные должны быть без потерь преобразуемы в Int64.
Dates.Week — MethodWeek(v)Создайте объект Week с заданным значением v. Входные данные должны быть без потерь преобразуемы в Int64.
Dates.Day — MethodDay(v)Создайте объект Day с заданным значением v. Входные данные должны быть без потерь преобразуемы в Int64.
Dates.Hour — MethodHour(dt::DateTime) -> HourЧасовая часть DateTime в виде Hour.
Dates.Minute — MethodMinute(dt::DateTime) -> MinuteМинутная часть DateTime в виде Minute.
Dates.Second — MethodSecond(dt::DateTime) -> SecondВторая часть DateTime в виде Second.
Dates.Millisecond — MethodMillisecond(dt::DateTime) -> MillisecondМиллисекундная часть DateTime в виде Millisecond.
Dates.Microsecond — MethodMicrosecond(dt::Time) -> MicrosecondМикросекундная часть времени в виде Microsecond.
Dates.Nanosecond — MethodNanosecond(dt::Time) -> NanosecondНаносекунда части времени как Nanosecond.
Dates.yearmonth — Functionyearmonth(dt::TimeType) -> (Int64, Int64)Одновременно возвращает год и месяц из Date или DateTime.
Dates.monthday — Functionmonthday(dt::TimeType) -> (Int64, Int64)Одновременно возвращает месяц и день части Date или DateTime.
Dates.yearmonthday — Functionyearmonthday(dt::TimeType) -> (Int64, Int64, Int64)Одновременно возвращает год, месяц и день части Date или DateTime.
Query Functions
Dates.dayname — Functiondayname(dt::TimeType; locale="русский") -> String
dayname(day::Integer; locale="русский") -> StringВозвращает полное название дня недели, соответствующее дате Date или DateTime в заданной locale. Также принимает Integer.
Примеры
julia> dayname(Date("2000-01-01"))
"Суббота"
julia> dayname(4)
"Четверг"Dates.dayabbr — Functiondayabbr(dt::TimeType; locale="русский") -> String
dayabbr(day::Integer; locale="русский") -> StringВозвращает сокращенное название, соответствующее дню недели для Date или DateTime в заданной locale. Также принимает Integer.
Примеры
julia> dayabbr(Date("2000-01-01"))
"Сб"
julia> dayabbr(3)
"Ср"Dates.dayofweek — Functiondayofweek(dt::TimeType) -> Int64Возвращает день недели в виде Int64 с 1 = Понедельник, 2 = Вторник и т.д..
Примеры
julia> dayofweek(Date("2000-01-01"))
6Dates.dayofmonth — Functiondayofmonth(dt::TimeType) -> Int64День месяца для Date или DateTime в виде Int64.
Dates.dayofweekofmonth — Functiondayofweekofmonth(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"))
3Dates.daysofweekinmonth — Functiondaysofweekinmonth(dt::TimeType) -> IntДля дня недели dt верните общее количество этого дня недели в месяце dt. Возвращает 4 или 5. Полезно в временных выражениях для указания последнего дня недели в месяце, включая dayofweekofmonth(dt) == daysofweekinmonth(dt) в функции корректировки.
Примеры
julia> daysofweekinmonth(Date("2005-01-01"))
5
julia> daysofweekinmonth(Date("2005-01-04"))
4Dates.monthname — Functionmonthname(dt::TimeType; locale="русский") -> String
monthname(month::Integer, locale="русский") -> StringВозвращает полное название месяца для Date или DateTime или Integer в указанной locale.
Примеры
julia> monthname(Date("2005-01-04"))
"Январь"
julia> monthname(2)
"Февраль"Dates.monthabbr — Functionmonthabbr(dt::TimeType; locale="русский") -> String
monthabbr(month::Integer, locale="русский") -> StringВозвращает сокращенное название месяца для Date или DateTime или Integer в указанной locale.
Примеры
julia> monthabbr(Date("2005-01-04"))
"Янв"
julia> monthabbr(2)
"Фев"Dates.daysinmonth — Functiondaysinmonth(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"))
29Dates.isleapyear — Functionisleapyear(dt::TimeType) -> BoolВозвращает true, если год dt является високосным.
Примеры
julia> isleapyear(Date("2004"))
true
julia> isleapyear(Date("2005"))
falseDates.dayofyear — Functiondayofyear(dt::TimeType) -> IntВозвращает день года для dt, при этом 1 января является днем 1.
Dates.daysinyear — Functiondaysinyear(dt::TimeType) -> IntВернуть 366, если год dt является високосным, в противном случае вернуть 365.
Примеры
julia> daysinyear(1999)
365
julia> daysinyear(2000)
366Dates.quarterofyear — Functionquarterofyear(dt::TimeType) -> IntВозвращает квартал, в котором находится dt. Диапазон значений от 1 до 4.
Dates.dayofquarter — Functiondayofquarter(dt::TimeType) -> IntВозвращает день текущего квартала dt. Диапазон значений от 1 до 92.
Adjuster Functions
Base.trunc — Methodtrunc(dt::TimeType, ::Type{Period}) -> TimeTypeОбрезает значение dt в соответствии с предоставленным типом Period.
Примеры
julia> trunc(DateTime("1996-01-01T12:30:00"), Day)
1996-01-01T00:00:00Dates.firstdayofweek — Functionfirstdayofweek(dt::TimeType) -> TimeTypeКорректирует dt на понедельник его недели.
Примеры
julia> firstdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-01T00:00:00Dates.lastdayofweek — Functionlastdayofweek(dt::TimeType) -> TimeTypeКорректирует dt на воскресенье его недели.
Примеры
julia> lastdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-07T00:00:00Dates.firstdayofmonth — Functionfirstdayofmonth(dt::TimeType) -> TimeTypeНастраивает dt на первый день его месяца.
Примеры
julia> firstdayofmonth(DateTime("1996-05-20"))
1996-05-01T00:00:00Dates.lastdayofmonth — Functionlastdayofmonth(dt::TimeType) -> TimeTypeКорректирует dt на последний день его месяца.
Примеры
julia> lastdayofmonth(DateTime("1996-05-20"))
1996-05-31T00:00:00Dates.firstdayofyear — Functionfirstdayofyear(dt::TimeType) -> TimeTypeКорректирует dt на первый день его года.
Примеры
julia> firstdayofyear(DateTime("1996-05-20"))
1996-01-01T00:00:00Dates.lastdayofyear — Functionlastdayofyear(dt::TimeType) -> TimeTypeКорректирует dt на последний день его года.
Примеры
julia> lastdayofyear(DateTime("1996-05-20"))
1996-12-31T00:00:00Dates.firstdayofquarter — Functionfirstdayofquarter(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:00Dates.lastdayofquarter — Functionlastdayofquarter(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:00Dates.tonext — Methodtonext(dt::TimeType, dow::Int; same::Bool=false) -> TimeTypeКорректирует dt на следующий день недели, соответствующий dow, где 1 = понедельник, 2 = вторник и т.д. Установка same=true позволяет считать текущее dt следующим dow, что позволяет избежать корректировки.
Dates.toprev — Methodtoprev(dt::TimeType, dow::Int; same::Bool=false) -> TimeTypeКорректирует dt на предыдущий день недели, соответствующий dow, где 1 = понедельник, 2 = вторник и т.д. Установка same=true позволяет считать текущее dt предыдущим dow, что позволяет избежать корректировки.
Dates.tofirst — Functiontofirst(dt::TimeType, dow::Int; of=Month) -> TimeTypeНастраивает dt на первый dow его месяца. В качестве альтернативы, of=Year настроит на первый dow года.
Dates.tolast — Functiontolast(dt::TimeType, dow::Int; of=Month) -> TimeTypeКорректирует dt на последний dow его месяца. В качестве альтернативы, of=Year скорректирует на последний dow года.
Dates.tonext — Methodtonext(func::Function, dt::TimeType; step=Day(1), limit=10000, same=false) -> TimeTypeКорректирует dt, выполняя не более limit итераций с увеличением на step, пока func не вернет true. func должен принимать один аргумент типа TimeType и возвращать Bool. Параметр same позволяет учитывать dt при удовлетворении func.
Dates.toprev — Methodtoprev(func::Function, dt::TimeType; step=Day(-1), limit=10000, same=false) -> TimeTypeКорректирует dt, выполняя не более limit итераций с увеличением step, пока func не вернет true. func должен принимать один аргумент типа TimeType и возвращать Bool. Параметр same позволяет учитывать dt при выполнении условия func.
Periods
Dates.Period — MethodГод(v)
Квартал(v)
Месяц(v)
Неделя(v)
День(v)
Час(v)
Минута(v)
Секунда(v)
Миллисекунда(v)
Микросекунда(v)
Наносекунда(v)Создайте тип Period с заданным значением v. Входные данные должны быть без потерь преобразуемы в Int64.
Dates.CompoundPeriod — MethodCompoundPeriod(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 минутDates.canonicalize — Functioncanonicalize(::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 минутDates.value — FunctionDates.value(x::Period) -> Int64Для данного периода верните значение, связанное с этим периодом. Например, value(Millisecond(10)) возвращает 10 как целое число.
Dates.default — Functiondefault(p::Period) -> PeriodВернуть разумное "значение по умолчанию" для входного периода, возвращая T(1) для Года, Месяца и Дня, и T(0) для Часа, Минуты, Секунды и Миллисекунды.
Dates.periods — FunctionDates.periods(::CompoundPeriod) -> Vector{Period}Возвращает Vector периодов Period, которые составляют данный CompoundPeriod.
Эта функция требует Julia 1.7 или более поздней версии.
Rounding Functions
Значения Date и DateTime могут быть округлены до заданного разрешения (например, 1 месяц или 15 минут) с помощью floor, ceil или round.
Base.floor — Methodfloor(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:00Base.ceil — Methodceil(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:00Base.round — Methodround(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).
Большинство значений Period также можно округлить до заданного разрешения:
Base.floor — Methodfloor(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 имеют непостоянную длину.
Base.ceil — Methodceil(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 имеют непостоянную длину.
Base.round — Methodround(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 имеют непостоянную длину.
Следующие функции не экспортируются:
Dates.floorceil — Functionfloorceil(dt::TimeType, p::Period) -> (TimeType, TimeType)Одновременно возвращает floor и ceil для Date или DateTime с разрешением p. Более эффективно, чем вызов floor и ceil по отдельности.
floorceil(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> (T, T)Одновременно возвращает floor и ceil для Period с разрешением p. Более эффективно, чем вызов floor и ceil по отдельности.
Dates.epochdays2date — Functionepochdays2date(days) -> DateВозьмите количество дней с момента округления эпохи (0000-01-01T00:00:00) и верните соответствующую Date.
Dates.epochms2datetime — Functionepochms2datetime(milliseconds) -> DateTimeВозьмите количество миллисекунд с момента округления эпохи (0000-01-01T00:00:00) и верните соответствующий DateTime.
Dates.date2epochdays — Functiondate2epochdays(dt::Date) -> Int64Возвращает количество дней с момента округления эпохи (0000-01-01T00:00:00) для данного Date в виде Int64.
Dates.datetime2epochms — Functiondatetime2epochms(dt::DateTime) -> Int64Возьмите данный DateTime и верните количество миллисекунд с момента начала эпохи (0000-01-01T00:00:00) в виде Int64.
Conversion Functions
Dates.today — Functiontoday() -> DateВозвращает дату из now().
Dates.unix2datetime — Functionunix2datetime(x) -> DateTimeВозьмите количество секунд с момента начала эпохи Unix 1970-01-01T00:00:00 и преобразуйте в соответствующий DateTime.
Dates.datetime2unix — Functiondatetime2unix(dt::DateTime) -> Float64Возвращает количество секунд с начала эпохи Unix 1970-01-01T00:00:00 для данного DateTime в виде Float64.
Dates.julian2datetime — Functionjulian2datetime(julian_days) -> DateTimeВозьмите количество дней юлианского календаря с начала эпохи -4713-11-24T12:00:00 и верните соответствующий DateTime.
Dates.datetime2julian — Functiondatetime2julian(dt::DateTime) -> Float64Возьмите данный DateTime и верните количество дней юлианского календаря с юлианской эпохи -4713-11-24T12:00:00 в виде Float64.
Dates.rata2datetime — Functionrata2datetime(days) -> DateTimeВозьмите количество дней Rata Die с начала эпохи 0000-12-31T00:00:00 и верните соответствующий DateTime.
Dates.datetime2rata — Functiondatetime2rata(dt::TimeType) -> Int64Возвращает количество дней Rata Die с начала эпохи для данного Date или DateTime.
Constants
Дни недели:
| Variable | Abbr. | Value (Int) |
|---|---|---|
Monday | Mon | 1 |
Tuesday | Tue | 2 |
Wednesday | Wed | 3 |
Thursday | Thu | 4 |
Friday | Fri | 5 |
Saturday | Sat | 6 |
Sunday | Sun | 7 |
Месяцы года:
| Variable | Abbr. | Value (Int) |
|---|---|---|
January | Jan | 1 |
February | Feb | 2 |
March | Mar | 3 |
April | Apr | 4 |
May | May | 5 |
June | Jun | 6 |
July | Jul | 7 |
August | Aug | 8 |
September | Sep | 9 |
October | Oct | 10 |
November | Nov | 11 |
December | Dec | 12 |
Common Date Formatters
Dates.ISODateTimeFormat — ConstantDates.ISODateTimeFormatОписывает форматирование ISO8601 для даты и времени. Это значение по умолчанию для Dates.format объекта DateTime.
Примеры
julia> Dates.format(DateTime(2018, 8, 8, 12, 0, 43, 1), ISODateTimeFormat)
"2018-08-08T12:00:43.001"Dates.ISODateFormat — ConstantDates.ISODateFormatОписывает форматирование ISO8601 для даты. Это значение по умолчанию для Dates.format объекта Date.
Примеры
julia> Dates.format(Date(2018, 8, 8), ISODateFormat)
"2018-08-08"Dates.ISOTimeFormat — ConstantDates.ISOTimeFormatОписывает форматирование ISO8601 для времени. Это значение по умолчанию для Dates.format объекта Time.
Примеры
julia> Dates.format(Time(12, 0, 43, 1), ISOTimeFormat)
"12:00:43.001"Dates.RFC1123Format — ConstantDates.RFC1123FormatОписывает форматирование RFC1123 для даты и времени.
Примеры
julia> Dates.format(DateTime(2018, 8, 8, 12, 0, 43, 1), RFC1123Format)
"Wed, 08 Aug 2018 12:00:43"- 1The notion of the UT second is actually quite fundamental. There are basically two different notions of time generally accepted, one based on the physical rotation of the earth (one full rotation = 1 day), the other based on the SI second (a fixed, constant value). These are radically different! Think about it, a "UT second", as defined relative to the rotation of the earth, may have a different absolute length depending on the day! Anyway, the fact that
DateandDateTimeare 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.