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 пустые строки могли передаваться в конструкторы и 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
, который по умолчанию разбивает ничьи в сторону четного числа, метод TimeType
4d61726b646f776e2e436f64652822222c2022726f756e642229_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
— TypeCompoundPeriod
CompoundPeriod
полезен для выражения временных периодов, которые не являются фиксированным кратным меньших периодов. Например, "год и день" не является фиксированным числом дней, но может быть выражен с помощью CompoundPeriod
. На самом деле, CompoundPeriod
автоматически создается при сложении различных типов периодов, например, Year(1) + Day(1)
дает результат в виде CompoundPeriod
.
Dates.Instant
— TypeМгновение
Instant
типы представляют собой целочисленные, машинные представления времени в виде непрерывных временных линий, начинающихся с эпохи.
Dates.UTInstant
— TypeUTInstant{T}
UTInstant
представляет собой машинную временную шкалу, основанную на времени UT (1 день = одно вращение Земли). T
- это параметр Period
, который указывает на разрешение или точность момента.
Dates.TimeType
— TypeTimeType
TimeType
типы оборачивают экземпляры Instant
машины, чтобы предоставить человеческие представления машинного момента. Time
, DateTime
и Date
являются подтипами TimeType
.
Dates.DateTime
— TypeDateTime
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
Dates.Date
— TypeДата
Date
оборачивает UTInstant{Day}
и интерпретирует его в соответствии с пролептическим григорианским календарем.
Dates.Time
— TypeВремя
Time
оборачивает Nanosecond
и представляет собой конкретный момент в 24-часовом дне.
Dates.TimeZone
— TypeTimeZone
Географическая зона, основанная на долготе, определяющая, какое время в определенном месте. Некоторые часовые пояса переходят на летнее время (например, EST -> EDT). Для реализации и дополнительной поддержки смотрите пакет TimeZones.jl
Dates.UTC
— TypeUTC
UTC
, или Координированное всемирное время, это 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:00
Dates.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-02
Dates.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:00
Dates.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.864
Base.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))
53
Dates.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"))
6
Dates.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"))
3
Dates.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"))
4
Dates.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"))
29
Dates.isleapyear
— Functionisleapyear(dt::TimeType) -> Bool
Возвращает true
, если год dt
является високосным.
Примеры
julia> isleapyear(Date("2004"))
true
julia> isleapyear(Date("2005"))
false
Dates.dayofyear
— Functiondayofyear(dt::TimeType) -> Int
Возвращает день года для dt
, при этом 1 января является днем 1.
Dates.daysinyear
— Functiondaysinyear(dt::TimeType) -> Int
Вернуть 366, если год dt
является високосным, в противном случае вернуть 365.
Примеры
julia> daysinyear(1999)
365
julia> daysinyear(2000)
366
Dates.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:00
Dates.firstdayofweek
— Functionfirstdayofweek(dt::TimeType) -> TimeType
Корректирует dt
на понедельник его недели.
Примеры
julia> firstdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-01T00:00:00
Dates.lastdayofweek
— Functionlastdayofweek(dt::TimeType) -> TimeType
Корректирует dt
на воскресенье его недели.
Примеры
julia> lastdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-07T00:00:00
Dates.firstdayofmonth
— Functionfirstdayofmonth(dt::TimeType) -> TimeType
Настраивает dt
на первый день его месяца.
Примеры
julia> firstdayofmonth(DateTime("1996-05-20"))
1996-05-01T00:00:00
Dates.lastdayofmonth
— Functionlastdayofmonth(dt::TimeType) -> TimeType
Корректирует dt
на последний день его месяца.
Примеры
julia> lastdayofmonth(DateTime("1996-05-20"))
1996-05-31T00:00:00
Dates.firstdayofyear
— Functionfirstdayofyear(dt::TimeType) -> TimeType
Корректирует dt
на первый день его года.
Примеры
julia> firstdayofyear(DateTime("1996-05-20"))
1996-01-01T00:00:00
Dates.lastdayofyear
— Functionlastdayofyear(dt::TimeType) -> TimeType
Корректирует dt
на последний день его года.
Примеры
julia> lastdayofyear(DateTime("1996-05-20"))
1996-12-31T00:00:00
Dates.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:00
Dates.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:00
Dates.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:00
Base.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:00
Base.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
в виде Month
s или Year
s не поддерживается, так как эти Period
s имеют непостоянную длину.
Следующие функции не экспортируются:
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
Date
andDateTime
are based on UT seconds is a simplifying, yet honest assumption so that things like leap seconds and all their complexity can be avoided. This basis of time is formally called UT or UT1. Basing types on the UT second basically means that every minute has 60 seconds and every day has 24 hours and leads to more natural calculations when working with calendar dates.