Даты
Модуль Dates предоставляет два типа для работы с датами: Date и DateTime, представляющие точность дня и миллисекунды соответственно; оба являются подтипами абстрактного TimeType. Мотивация для разных типов проста: некоторые операции намного проще, как с точки зрения кода, так и с точки зрения логического мышления, когда не нужно учитывать сложность большей точности. Например, так как тип Date разрешается только до точности одной даты (т.е. без часов, минут или секунд), обычные соображения по часовым поясам, летнему/зимнему времени и високосным секундам не нужны и не используются.
Оба типа Date и DateTime в основном являются неизменяемыми обёртками Int64. Единственное поле instant любого типа на самом деле является типом UTInstant{P}, который представляет непрерывно возрастающую временную шкалу машины, основанную на секунде UT [1]. Тип DateTime не учитывает часовые пояса (неявный, по терминологии Python), аналогично LocalDateTime в Java 8. Дополнительную функциональность часовых поясов можно добавить с помощью пакета TimeZones.jl, который компилирует базу данных часовых поясов IANA. Оба типа Date и DateTime основаны на стандарте ISO 8601, который следует пролептическому григорианскому календарю. Отметим, что стандарт ISO 8601 чётко определяет даты до н.э. / до н. э. В общем, последний день эпохи до н.э. / до н. э., 31-12-01 до н. э. / до н. э., был заменён на 01-01-01 н. э. / н. э., поэтому года нуль не существует. Однако стандарт ISO гласит, что 1 до н.э. / до н. э. – это год нуль, поэтому 0000-12-31 – это день перед 0001-01-01, а год -0001 (да, минус один для года) – это 2 до н.э. / до н. э., год -0002 – это 3 до н.э. / до н. э. и т.д.
Конструкторы
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 парсинг выполняется с помощью форматов строк. Форматы строк работают путём определения разграниченных или фиксированных "слотов", содержащих период для парсинга, и передачей текста для парсинга и строку формата в конструктор Date или DateTime, в форме 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 н. э.). Следовательно, пустая строка всегда возвращает 0001-01-01 для Date и 0001-01-01T00:00:00.000 для DateTime.
Фиксированные слоты задаются путём повторения символа периода количество раз, соответствующее ширине без разделителя между символами. Таким образом, dateformat"yyyymmdd" соответствует строке даты, например, "20140716". Парсер различает фиксированный слот отсутствием разделителя, отмечая переход "yyyymm" от одного символа периода к другому.
Поддерживается также парсинг месяцев в текстовой форме с помощью символов u и U для сокращённых и полных названий месяцев соответственно. По умолчанию поддерживаются только английские названия месяцев, поэтому u соответствует "Янв", "Фев", "Март" и т. д. А U соответствует "Январь", "Февраль", "Март" и т. д. Аналогично другим функциям сопоставления имя => значение 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"), который использует формат по умолчанию. Существенное различие между функциями заключается в том, что при использовании tryparse ошибка не возникает, если строка имеет неверный формат; вместо этого возвращается nothing. Тем не менее, как и в конструкторах выше, пустые части дат и времени предполагают значения по умолчанию, и, следовательно, пустая строка ("") действительна для любой DateFormat, давая, например, Date 0001-01-01. Код, полагающийся на parse или tryparse для Date и DateTime парсинга, поэтому должен проверять, пуста ли входная строка перед использованием результата.
Полный набор тестов и примеров парсинга и форматирования доступен в stdlib/Dates/test/io.jl.
Длительности/Сравнения
Нахождение длительности между двумя Date или DateTime простая задача, учитывая их внутреннее представление как UTInstant{Day} и UTInstant{Millisecond} соответственно. Разница между Date возвращается в количестве Day, а DateTime – в количестве 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
Функции доступа
Поскольку типы 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
В то время как заглавные возвращают то же самое значение в соответствующем типе 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
Функции запроса
Функции запроса предоставляют календарную информацию о 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_monts_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_monts_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
Когда вы работаете с любым языком/фреймворком для дат, полезно ознакомиться с тем, как обрабатывается арифметика дат и периодов, так как существуют некоторые сложные вопросы (хотя для типов с точностью до дня они намного менее сложны).
Модуль Dates пытается следовать простому принципу минимальных изменений при выполнении арифметических операций с Period. Этот подход также часто называют календарной арифметикой или тем, что вы, вероятно, предположили бы, если бы вас спросили о таком же расчёте в разговоре. В чём же суть? Рассмотрим классический пример: прибавьте 1 месяц к 31 января 2014 года. Какой будет ответ? Javascript ответит 3 марта (предполагает 31 день). PHP ответит 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
Сложно? Возможно. Что делать простому пользователю 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
Функции коррекции
Хотя арифметика дат и периодов удобна, часто для вычислений с датами требуются календарные или временные особенности, а не фиксированное количество периодов. Праздники — идеальный пример; большинство из них следуют правилам, таким как «День памяти = последний понедельник мая» или «День благодарения = четвёртый четверг ноября». Эти виды временных выражений оперируют правилами, связанными с календарём, например, первым или последним числом месяца, следующим вторником или первым и третьим средами и т. д.
Модуль 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 — это просто функция, обычно анонимная, которая принимает один TimeType в качестве входных данных и возвращает 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.
Типы периодов
Периоды — это человеческое представление о дискретных, иногда нерегулярных промежутках времени. Рассмотрим 1 месяц; он может представлять, в днях, значение 28, 29, 30 или 31 в зависимости от года и месяца. Или год может представлять 365 или 366 дней в случае високосного года. Типы Period — это простые обёртки Int64 и создаются путём обёртывания любого типа, преобразуемого к Int64, то есть Year(1) или Month(3.0). Арифметика между Period одного типа ведёт себя как целые числа, и доступна ограниченная арифметика 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
Округление
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, который по умолчанию разрывает ничьи в сторону чётного числа, метод TimeTyperound использует режим округления RoundNearestTiesUp. (Сложно представить, что означало бы разбиение ничьих к ближайшему «чётному» TimeType). Более подробные сведения о доступных режимах округления можно найти в справочнике по API.
Округление в целом должно работать как ожидается, но есть несколько случаев, в которых ожидаемое поведение не очевидно.
Эпоха округления
Во многих случаях точность, указанная для округления (например, 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 значений Date с использованием обозначения Rata Die; но поскольку стандарт 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 включает ноль года) приведёт к DateTime с чётным значением в этом поле, в то время как округление DateTime до чётного числа месяцев приведёт к значению месяца, имеющему нечётное значение. Так как и месяцы, и годы могут содержать нечётное число дней, то чётно ли значение в поле дней при округлении до чётного числа дней — неопределённо.
Дополнительную информацию о методах, экспортируемых из модуля Dates , см. в справочнике по API.
Справочник по API
Типы дат и времени
Dates.PeriodТип
Period Year Quarter Month Week Day Hour Minute Second Millisecond Microsecond Nanosecond
Period типы представляют собой дискретные, человекочитаемые представления времени.
Dates.CompoundPeriodТип
CompoundPeriod
Период CompoundPeriod полезен для выражения временных промежутков, которые не являются фиксированным кратным меньшим периодам. Например, «год и один день» — это не фиксированное количество дней, но может быть выражено с помощью CompoundPeriod. Фактически, CompoundPeriod автоматически генерируется при сложении различных типов периодов, например, Year(1) + Day(1) даёт CompoundPeriod результат.
Dates.InstantТип
Instant
Instant типы представляют целочисленные, машинные представления времени как непрерывные временные шкалы, начинающиеся с эпохи.
Dates.UTInstantТип
UTInstant{T}
UTInstant представляет машинную временную шкалу, основанную на времени UT (1 день = одно вращение Земли). T — это Period параметр, который указывает на разрешение или точность момента.
Dates.TimeTypeТип
TimeType
TimeType типы оборачивают Instant машинные экземпляры, чтобы предоставить человекочитаемые представления машинного момента. Time, DateTime и Date являются подтипами TimeType.
Dates.DateTimeТип
DateTime
DateTime оборачивает UTInstant{Millisecond} и интерпретирует его согласно пролептическому григорианскому календарю.
Dates.DateТип
Date
Date оборачивает UTInstant{Day} и интерпретирует его согласно пролептическому григорианскому календарю.
Dates.TimeТип
Time
Time оборачивает Nanosecond и представляет собой определённый момент в 24-часовом дне.
Dates.TimeZoneТип
TimeZone
Географическая зона, обычно основанная на долготе, определяющая время в определённом месте. Некоторые часовые пояса соблюдают летнее время (например, EST —> EDT). Для реализации и дополнительной поддержки см. пакет TimeZones.jl
Dates.UTCТип
UTC
UTC, или Координированное универсальное время, является TimeZone, от которого измеряются все остальные. Оно связано со временем на 0° долготы. Оно не корректируется на летнее время.
Функции модуля Dates
Dates.DateTimeМетод
DateTime(y, [m, d, h, mi, s, ms]) -> DateTime
Создать тип DateTime по частям. Аргументы должны быть преобразуемы в Int64.
Dates.DateTimeМетод
DateTime(periods::Period...) -> DateTime
Создать тип DateTime по частям типа Period. Аргументы могут быть в любом порядке. Части DateTime, которые не указаны, будут по умолчанию иметь значение Dates.default(period).
Dates.DateTimeМетод
DateTime(f::Function, y[, m, d, h, mi, s]; step=Day(1), limit=10000) -> DateTime
Создать DateTime с помощью API корректировки. Точка отсчёта будет построена из предоставленных аргументов y, m, d..., и будет корректироваться до тех пор, пока f::Function не вернёт true. Размер шага при корректировке можно указать вручную через ключевое слово step . limit задаёт предел максимального числа итераций, которые API корректировки будут продолжать выполнять, прежде чем выбросить ошибку (в случае, если f::Function никогда не будет удовлетворено).
Примеры
julia> DateTime(dt -> Dates.second(dt) == 40, 2010, 10, 20, 10; step = Dates.Second(1)) 2010-10-20T10:00:40 julia> DateTime(dt -> Dates.hour(dt) == 20, 2010, 10, 20, 10; step = Dates.Hour(1), limit = 5) ERROR: ArgumentError: Adjustment limit reached: 5 iterations Stacktrace: [...]исходный код
Dates.DateTimeМетод
DateTime(dt::Date) -> DateTime
Преобразовать Date в DateTime. Части часа, минуты, секунды и миллисекунды нового DateTime предполагаются равными нулю.
Dates.DateTimeМетод
DateTime(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] # preferred
2-element Vector{DateTime}:
2020-01-01T00:00:00
2020-01-02T00:00:00
исходный код
Dates.formatМетод
format(dt::TimeType, format::AbstractString; locale="english") -> AbstractString
Создайте строку, используя объект TimeType и применяя предоставленный format. Для построения строки format можно использовать следующие коды символов:
| Код | Примеры | Комментарий |
|---|---|---|
y |
6 | Числовой год с фиксированной шириной |
Y |
1996 | Числовой год с минимальной шириной |
m |
1, 12 | Числовой месяц с минимальной шириной |
u |
Янв | Сокращенное название месяца до 3 символов в соответствии с locale
|
U |
Январь | Полное название месяца в соответствии с ключевым словом locale |
d |
1, 31 | День месяца с минимальной шириной |
H |
0, 23 | Час (24-часовой формат) с минимальной шириной |
M |
0, 59 | Минута с минимальной шириной |
S |
0, 59 | Секунда с минимальной шириной |
s |
000, 500 | Миллисекунда с минимальной шириной 3 |
e |
Пн, Вт | Сокращенные дни недели |
E |
Понедельник | Полное название дня недели |
Количество последовательных символов кода указывает ширину кода. Формат yyyy-mm указывает, что код y должен иметь ширину четыре, а m — ширину два. Коды, которые дают числовые цифры, имеют связанный режим: фиксированной ширины или минимальной ширины. Режим фиксированной ширины дополняет значение слева нулями, когда оно короче заданной ширины, и обрезает значение, когда оно длиннее. Режим минимальной ширины работает так же, как режим фиксированной ширины, за исключением того, что он не обрезает значения, которые длиннее ширины.
При создании format вы можете использовать любые символы, не являющиеся кодами, в качестве разделителей. Например, для создания строки "1996-01-15T00:00:00" можно использовать format: "гггг-мм-ддЧЧ:ММ:СС". Обратите внимание, что если вам нужно использовать символ кода как буквальный символ, вы можете использовать символ экранирования обратный слэш. Строка "1996y01m" может быть создана с форматом "гггг\мм\м".
Dates.DateFormatТип
DateFormat(format::AbstractString, locale="english") -> DateFormat
Создайте объект форматирования даты, который можно использовать для анализа строк дат или форматирования объекта даты в виде строки. Для построения строки format можно использовать следующие коды символов:
| Код | Совпадения | Комментарий |
|---|---|---|
y |
1996, 96 | Возвращает год 1996, 0096 |
Y |
1996, 96 | Возвращает год 1996, 0096. Эквивалентно y
|
m |
1, 01 | Совпадение с месяцами из 1 или 2 цифр |
u |
Янв | Совпадение с сокращенными названиями месяцев в соответствии с ключевым словом locale |
U |
Январь | Совпадение с полными названиями месяцев в соответствии с ключевым словом locale |
d |
1, 01 | Совпадение с днями из 1 или 2 цифр |
H |
00 | Совпадение с часами (24-часовой формат) |
I |
00 | Для вывода часов в 12-часовом формате |
M |
00 | Совпадение с минутами |
S |
00 | Совпадение с секундами |
s |
.500 | Совпадение с миллисекундами |
e |
Пн, Вт | Совпадение с сокращенными днями недели |
E |
Понедельник | Совпадение с полными названиями дней недели |
p |
ДОП | Совпадение с AM/PM (регистронезависимо) |
yyyymmdd |
19960101 | Совпадение с годом, месяцем и днем фиксированной ширины |
Символы, не указанные выше, обычно обрабатываются как разделители между частями даты и времени. Например, строка dt "1996-01-15T00:00:00.0" будет иметь строку format "y-m-dTH:M:S.s". Если вам нужно использовать символ кода в качестве разделителя, вы можете экранировать его с помощью обратного слэша. Дата "1995y01m" будет иметь формат "y\ym\m".
Обратите внимание, что 12:00 AM соответствует 00:00 (полночь), а 12:00 PM соответствует 12:00 (день). При анализе времени со спецификатором p, любой час (либо H или I) интерпретируется как 12-часовой формат, поэтому код I в основном полезен для вывода.
Создание объекта DateFormat дорогостоящее. По возможности создавайте его один раз и используйте многократно или попробуйте макрос строки dateformat"". Использование этого макроса создаёт объект DateFormat один раз во время макрорасширения и повторно использует его позже. Также существуют несколько предопределенных форматировщиков, перечисленных позже.
См. DateTime и format для того, как использовать объект DateFormat для анализа и записи строк дат соответственно.
Dates.@dateformat_strМакрос
dateformat"Y-m-d H:M:S"
Создайте объект DateFormat. Аналогично DateFormat("Y-m-d H:M:S"), но создает объект DateFormat один раз во время макрорасширения.
См. DateFormat для подробностей о спецификаторах формата.
Dates.DateTimeМетод
DateTime(dt::AbstractString, df::DateFormat=ISODateTimeFormat) -> DateTime
Создайте объект DateTime, проанализировав строку даты и времени dt в соответствии с шаблоном, заданным объектом DateFormat, или dateformat"гггг-мм-ддЧЧ:ММ:СС.с", если он опущен.
Аналогично DateTime(::AbstractString, ::AbstractString), но более эффективно при многократном анализе аналогично отформатированных строк даты и времени с предварительно созданным объектом DateFormat.
Dates.DateМетод
Date(y, [m, d]) -> Date
Создайте тип Date, используя части. Аргументы должны быть преобразуемы в Int64.
Dates.DateМетод
Date(period::Period...) -> Date
Создайте тип Date по частям типа Period. Аргументы могут быть в любом порядке. Части Date которые не указаны, будут по умолчанию иметь значение Dates.default(period).
Dates.DateМетод
Date(f::Function, y[, m, d]; step=Day(1), limit=10000) -> Date
Создайте Date с помощью API корректировки. Начальная точка будет построена из предоставленных y, m, d аргументов и будет скорректирована до тех пор, пока f::Function не вернёт true. Размер шага при корректировке можно указать вручную с помощью ключевого слова step. limit устанавливает ограничение на максимальное количество итераций, которые API корректировки будет пытаться выполнить до выдачи ошибки (при условии, что f::Function никогда не будет удовлетворено).
Примеры
julia> Date(date -> Dates.week(date) == 20, 2010, 01, 01) 2010-05-17 julia> Date(date -> Dates.year(date) == 2010, 2000, 01, 01) 2010-01-01 julia> Date(date -> Dates.month(date) == 10, 2000, 01, 01; limit = 5) ERROR: ArgumentError: Adjustment limit reached: 5 iterations Stacktrace: [...]исходный код
Dates.DateМетод
Date(dt::DateTime) -> Date
Преобразовать DateTime в Date. Часы, минуты, секунды и миллисекунды DateTime отбрасываются, поэтому для построения используются только год, месяц и день.
Dates.DateМетод
Date(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] # preferred
2-element Vector{Date}:
2020-01-01
2020-01-02
исходный код
Dates.DateМетод
Date(d::AbstractString, df::DateFormat=ISODateFormat) -> Date
Построить Date, разобрав строку даты d по шаблону, заданному в объекте DateFormat, или по умолчанию "yyyy-mm-dd".
Аналогично Date(::AbstractString, ::AbstractString), но более эффективно при многократном разборе строк даты с одинаковым форматом с предварительно созданным объектом DateFormat.
Dates.TimeМетод
Time(h, [mi, s, ms, us, ns]) -> Time
Построить тип Time по частям. Аргументы должны быть преобразуемы в Int64.
Dates.TimeМетод
Time(period::TimePeriod...) -> Time
Построить тип Time по частям типа Period. Аргументы могут быть в любом порядке. Не указанные Time части по умолчанию принимают значение Dates.default(period).
Dates.TimeМетод
Time(f::Function, h, mi=0; step::Period=Second(1), limit::Int=10000) Time(f::Function, h, mi, s; step::Period=Millisecond(1), limit::Int=10000) Time(f::Function, h, mi, s, ms; step::Period=Microsecond(1), limit::Int=10000) Time(f::Function, h, mi, s, ms, us; step::Period=Nanosecond(1), limit::Int=10000)
Создать Time с помощью API корректировки. Начальная точка будет построена из предоставленных h, mi, s, ms, us аргументов и будет скорректирована до тех пор, пока f::Function не вернёт true. Размер шага при корректировке можно указать вручную с помощью ключевого слова step. limit ограничивает максимальное количество итераций, которые API корректировки будет пытаться выполнить до выдачи ошибки (в случае, если f::Function никогда не будет удовлетворено). Обратите внимание, что по умолчанию шаг корректировки будет настроен на обеспечение большей точности для заданных аргументов; т.е. если указаны аргументы часов, минут и секунд, шаг по умолчанию будет Millisecond(1), а не Second(1).
Примеры
julia> Dates.Time(t -> Dates.minute(t) == 30, 20) 20:30:00 julia> Dates.Time(t -> Dates.minute(t) == 0, 20) 20:00:00 julia> Dates.Time(t -> Dates.hour(t) == 10, 3; limit = 5) ERROR: ArgumentError: Adjustment limit reached: 5 iterations Stacktrace: [...]исходный код
Dates.TimeМетод
Time(dt::DateTime) -> Time
Преобразовать DateTime в Time. Часы, минуты, секунды и миллисекунды DateTime используются для создания нового Time. Микросекунды и наносекунды по умолчанию равны нулю.
Dates.TimeМетод
Time(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] # preferred
2-element Vector{Time}:
12:34:00
02:34:00
исходный код
Dates.TimeМетод
Time(t::AbstractString, df::DateFormat=ISOTimeFormat) -> Time
Построить Time, разобрав строку даты и времени t по шаблону, заданному в объекте DateFormat, или по умолчанию "HH:MM:SS.s".
Аналогично Time(::AbstractString, ::AbstractString), но более эффективно при многократном разборе строк времени с одинаковым форматом с предварительно созданным объектом DateFormat.
Dates.nowМетод
now() -> DateTime
Возвращает DateTime, соответствующий системному времени пользователя, включая локаль системной временной зоны.
Dates.nowМетод
now(::Type{UTC}) -> DateTime
Возвращает DateTime, соответствующий системному времени пользователя в формате UTC/GMT.
Base.epsМетод
eps(::Type{DateTime}) -> Millisecond
eps(::Type{Date}) -> Day
eps(::Type{Time}) -> Nanosecond
eps(::TimeType) -> Period
Возвращает наименьшее значение единицы, поддерживаемое TimeType.
Примеры
julia> eps(DateTime) 1 millisecond julia> eps(Date) 1 day julia> eps(Time) 1 nanosecondисходный код
Функции-аксессоры
Dates.yearФункция
year(dt::TimeType) -> Int64
Год Date или DateTime как Int64.
Dates.monthФункция
month(dt::TimeType) -> Int64
Месяц Date или DateTime как Int64.
Dates.weekФункция
week(dt::TimeType) -> Int64
Возвращает номер недели ISO даты Date или DateTime как Int64. Обратите внимание, что первой неделей года является неделя, содержащая первый четверг года, что может привести к тому, что даты до 4 января будут относиться к последней неделе предыдущего года. Например, week(Date(2005, 1, 1)) — 53-я неделя 2004 года.
Примеры
julia> Dates.week(Date(1989, 6, 22)) 25 julia> Dates.week(Date(2005, 1, 1)) 53 julia> Dates.week(Date(2004, 12, 31)) 53исходный код
Dates.dayФункция
day(dt::TimeType) -> Int64
День месяца Date или DateTime как Int64.
Dates.hourФункция
hour(dt::DateTime) -> Int64
Час дня DateTime в виде Int64.
hour(t::Time) -> Int64
Час Time в виде Int64.
Dates.minuteФункция
minute(dt::DateTime) -> Int64
Минута DateTime в виде Int64.
minute(t::Time) -> Int64
Минута Time в виде Int64.
Dates.secondФункция
second(dt::DateTime) -> Int64
Секунда DateTime в виде Int64.
second(t::Time) -> Int64
Секунда Time в виде Int64.
Dates.millisecondФункция
millisecond(dt::DateTime) -> Int64
Миллисекунда DateTime в виде Int64.
millisecond(t::Time) -> Int64
Миллисекунда Time в виде Int64.
Dates.microsecondФункция
microsecond(t::Time) -> Int64
Микросекунда Time в виде Int64.
Dates.nanosecondФункция
nanosecond(t::Time) -> Int64
Наносекунда Time в виде Int64.
Dates.YearМетод
Year(v)
Создаёт объект Year с заданным значением v. Входное значение должно быть без потерь преобразуемо в Int64.
Dates.MonthМетод
Month(v)
Создаёт объект Month с заданным значением v. Входное значение должно быть без потерь преобразуемо в Int64.
Dates.WeekМетод
Week(v)
Создаёт объект Week с заданным значением v. Входное значение должно быть без потерь преобразуемо в Int64.
Dates.DayМетод
Day(v)
Создаёт объект Day с заданным значением v. Входное значение должно быть без потерь преобразуемо в Int64.
Dates.HourМетод
Hour(dt::DateTime) -> Hour
Часовая часть DateTime в виде Hour.
Dates.MinuteМетод
Minute(dt::DateTime) -> Minute
Минутная часть DateTime в виде Minute.
Dates.SecondМетод
Second(dt::DateTime) -> Second
Секундная часть DateTime в виде Second.
Dates.MillisecondМетод
Millisecond(dt::DateTime) -> Millisecond
Миллисекундная часть DateTime в виде Millisecond.
Dates.MicrosecondМетод
Microsecond(dt::Time) -> Microsecond
Микросекундная часть Time в виде Microsecond.
Dates.NanosecondМетод
Nanosecond(dt::Time) -> Nanosecond
Наносекундная часть Time в виде Nanosecond.
Dates.yearmonthФункция
yearmonth(dt::TimeType) -> (Int64, Int64)
Одновременно возвращает год и месяц Date или DateTime.
Dates.monthdayФункция
monthday(dt::TimeType) -> (Int64, Int64)
Одновременно возвращает месяц и день Date или DateTime.
Dates.yearmonthdayФункция
yearmonthday(dt::TimeType) -> (Int64, Int64, Int64)
Одновременно возвращает год, месяц и день Date или DateTime.
Функции запроса
Dates.daynameФункция
dayname(dt::TimeType; locale="english") -> String dayname(day::Integer; locale="english") -> String
Возвращает полное название дня недели для Date или DateTime в заданном locale. Также принимает Integer.
Примеры
julia> Dates.dayname(Date("2000-01-01"))
"Saturday"
julia> Dates.dayname(4)
"Thursday"
исходный код
Dates.dayabbrФункция
dayabbr(dt::TimeType; locale="english") -> String dayabbr(day::Integer; locale="english") -> String
Возвращает сокращённое название дня недели для Date или DateTime в заданном locale. Также принимает Integer.
Примеры
julia> Dates.dayabbr(Date("2000-01-01"))
"Sat"
julia> Dates.dayabbr(3)
"Wed"
исходный код
Dates.dayofweekФункция
dayofweek(dt::TimeType) -> Int64
Возвращает день недели в виде Int64 с 1 = Monday, 2 = Tuesday, etc..
Примеры
julia> Dates.dayofweek(Date("2000-01-01"))
6
исходный код
Dates.dayofmonthФункция
dayofmonth(dt::TimeType) -> Int64
День месяца Date или DateTime в виде Int64.
Dates.dayofweekofmonthФункция
dayofweekofmonth(dt::TimeType) -> Int
Для дня недели dt, возвращает его порядковый номер в месяце dt. Если день недели dt — понедельник, то 1 = First Monday of the month, 2 = Second Monday of the month, etc. В диапазоне от 1 до 5.
Примеры
julia> Dates.dayofweekofmonth(Date("2000-02-01"))
1
julia> Dates.dayofweekofmonth(Date("2000-02-08"))
2
julia> Dates.dayofweekofmonth(Date("2000-02-15"))
3
исходный код
Dates.daysofweekinmonthФункция
daysofweekinmonth(dt::TimeType) -> Int
Для дня недели dt, возвращает общее количество таких дней недели в месяце dt. Возвращает 4 или 5. Полезно в временных выражениях для указания последнего дня недели в месяце, включая dayofweekofmonth(dt) == daysofweekinmonth(dt) в функцию корректировки.
Примеры
julia> Dates.daysofweekinmonth(Date("2005-01-01"))
5
julia> Dates.daysofweekinmonth(Date("2005-01-04"))
4
исходный код
Dates.monthnameФункция
monthname(dt::TimeType; locale="english") -> String monthname(month::Integer, locale="english") -> String
Возвращает полное имя месяца Date или DateTime или Integer в заданном locale.
Примеры
julia> Dates.monthname(Date("2005-01-04"))
"January"
julia> Dates.monthname(2)
"February"
исходный код
Dates.monthabbrФункция
monthabbr(dt::TimeType; locale="english") -> String monthabbr(month::Integer, locale="english") -> String
Возвращает сокращенное имя месяца Date или DateTime или Integer в заданном locale.
Примеры
julia> Dates.monthabbr(Date("2005-01-04"))
"Jan"
julia> monthabbr(2)
"Feb"
исходный код
Dates.daysinmonthФункция
daysinmonth(dt::TimeType) -> Int
Возвращает количество дней в месяце dt. Значение будет 28, 29, 30 или 31.
Примеры
julia> Dates.daysinmonth(Date("2000-01"))
31
julia> Dates.daysinmonth(Date("2001-02"))
28
julia> Dates.daysinmonth(Date("2000-02"))
29
исходный код
Dates.isleapyearФункция
isleapyear(dt::TimeType) -> Bool
Возвращает true, если год dt високосный.
Примеры
julia> Dates.isleapyear(Date("2004"))
true
julia> Dates.isleapyear(Date("2005"))
false
исходный код
Dates.dayofyearФункция
dayofyear(dt::TimeType) -> Int
Возвращает день года для dt, где 1 января — день 1.
Dates.daysinyearФункция
daysinyear(dt::TimeType) -> Int
Возвращает 366, если год dt високосный, иначе 365.
Примеры
julia> Dates.daysinyear(1999) 365 julia> Dates.daysinyear(2000) 366исходный код
Dates.quarterofyearФункция
quarterofyear(dt::TimeType) -> Int
Возвращает квартал, в котором находится dt. Диапазон значений от 1 до 4.
Dates.dayofquarterФункция
dayofquarter(dt::TimeType) -> Int
Возвращает день текущего квартала dt. Диапазон значений от 1 до 92.
Функции корректировки
Base.truncМетод
trunc(dt::TimeType, ::Type{Period}) -> TimeType
Округляет значение dt в соответствии с предоставленным типом Period.
Примеры
julia> trunc(Dates.DateTime("1996-01-01T12:30:00"), Dates.Day)
1996-01-01T00:00:00
исходный код
Dates.firstdayofweekФункция
firstdayofweek(dt::TimeType) -> TimeType
Корректирует dt до понедельника своей недели.
Примеры
julia> Dates.firstdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-01T00:00:00
исходный код
Dates.lastdayofweekФункция
lastdayofweek(dt::TimeType) -> TimeType
Корректирует dt до воскресенья своей недели.
Примеры
julia> Dates.lastdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-07T00:00:00
исходный код
Dates.firstdayofmonthФункция
firstdayofmonth(dt::TimeType) -> TimeType
Корректирует dt до первого дня своего месяца.
Примеры
julia> Dates.firstdayofmonth(DateTime("1996-05-20"))
1996-05-01T00:00:00
исходный код
Dates.lastdayofmonthФункция
lastdayofmonth(dt::TimeType) -> TimeType
Корректирует dt до последнего дня своего месяца.
Примеры
julia> Dates.lastdayofmonth(DateTime("1996-05-20"))
1996-05-31T00:00:00
исходный код
Dates.firstdayofyearФункция
firstdayofyear(dt::TimeType) -> TimeType
Корректирует dt до первого дня своего года.
Примеры
julia> Dates.firstdayofyear(DateTime("1996-05-20"))
1996-01-01T00:00:00
исходный код
Dates.lastdayofyearФункция
lastdayofyear(dt::TimeType) -> TimeType
Корректирует dt до последнего дня своего года.
Примеры
julia> Dates.lastdayofyear(DateTime("1996-05-20"))
1996-12-31T00:00:00
исходный код
Dates.firstdayofquarterФункция
firstdayofquarter(dt::TimeType) -> TimeType
Корректирует dt до первого дня своего квартала.
Примеры
julia> Dates.firstdayofquarter(DateTime("1996-05-20"))
1996-04-01T00:00:00
julia> Dates.firstdayofquarter(DateTime("1996-08-20"))
1996-07-01T00:00:00
исходный код
Dates.lastdayofquarterФункция
lastdayofquarter(dt::TimeType) -> TimeType
Корректирует dt до последнего дня своего квартала.
Примеры
julia> Dates.lastdayofquarter(DateTime("1996-05-20"))
1996-06-30T00:00:00
julia> Dates.lastdayofquarter(DateTime("1996-08-20"))
1996-09-30T00:00:00
исходный код
Dates.tonextМетод
tonext(dt::TimeType, dow::Int; same::Bool=false) -> TimeType
Корректирует dt до следующего дня недели, соответствующего dow с 1 = Monday, 2 = Tuesday, etc. Установка same=true позволяет рассматривать текущий dt как следующий dow, что приводит к отсутствию корректировки.
Dates.toprevМетод
toprev(dt::TimeType, dow::Int; same::Bool=false) -> TimeType
Корректирует dt до предыдущего дня недели, соответствующего dow с 1 = Monday, 2 = Tuesday, etc. Установка same=true позволяет рассматривать текущий dt как предыдущий dow, что приводит к отсутствию корректировки.
Dates.tofirstФункция
tofirst(dt::TimeType, dow::Int; of=Month) -> TimeType
Настраивает dt на первое dow месяца. В качестве альтернативы, of=Year будет настроено на первое dow года.
Dates.tolastФункция
tolast(dt::TimeType, dow::Int; of=Month) -> TimeType
Настраивает dt на последнее dow месяца. В качестве альтернативы, of=Year будет настроено на последнее dow года.
Dates.tonextМетод
tonext(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Метод
toprev(func::Function, dt::TimeType; step=Day(-1), limit=10000, same=false) -> TimeType
Настраивает dt путем итерации не более чем limit итераций с шагом step до тех пор, пока func не вернёт true. func должен принимать один TimeType аргумент и возвращать Bool. same позволяет dt быть рассмотренным при удовлетворении func.
Периоды
Dates.PeriodМетод
Year(v) Quarter(v) Month(v) Week(v) Day(v) Hour(v) Minute(v) Second(v) Millisecond(v) Microsecond(v) Nanosecond(v)
Создаёт тип Period со значением v. Входное значение должно быть без потерь преобразуемо в Int64.
Dates.CompoundPeriodМетод
CompoundPeriod(periods) -> CompoundPeriod
Создаёт CompoundPeriod из Vector Period. Все Period одного типа будут сложены вместе.
Примеры
julia> Dates.CompoundPeriod(Dates.Hour(12), Dates.Hour(13)) 25 hours julia> Dates.CompoundPeriod(Dates.Hour(-1), Dates.Minute(1)) -1 hour, 1 minute julia> Dates.CompoundPeriod(Dates.Month(1), Dates.Week(-2)) 1 month, -2 weeks julia> Dates.CompoundPeriod(Dates.Minute(50000)) 50000 minutesисходный код
Dates.valueФункция
Dates.value(x::Period) -> Int64
Для заданного периода возвращает соответствующее значение. Например, value(Millisecond(10)) возвращает 10 как целое число.
Dates.defaultФункция
default(p::Period) -> Period
Возвращает разумное значение по умолчанию для входящего периода, возвращая T(1) для Года, Месяца и Дня, и T(0) для Часа, Минуты, Секунды и Миллисекунды.
Dates.periodsФункция
Dates.periods(::CompoundPeriod) -> Vector{Period}
Возвращает Vector Period составляющих данный CompoundPeriod.
Эта функция требует Julia 1.7 или более поздней версии.
Функции округления
Значения Date и DateTime можно округлить до заданного разрешения (например, 1 месяц или 15 минут) с помощью floor, ceil, или round.
Base.floorМетод
floor(dt::TimeType, p::Period) -> TimeType
Возвращает ближайшее Date или DateTime меньшее или равное dt с разрешением p.
Для удобства, p может быть типом вместо значения: floor(dt, Dates.Hour) является сокращением для floor(dt, Dates.Hour(1)).
julia> floor(Date(1985, 8, 16), Dates.Month) 1985-08-01 julia> floor(DateTime(2013, 2, 13, 0, 31, 20), Dates.Minute(15)) 2013-02-13T00:30:00 julia> floor(DateTime(2016, 8, 6, 12, 0, 0), Dates.Day) 2016-08-06T00:00:00исходный код
Base.ceilМетод
ceil(dt::TimeType, p::Period) -> TimeType
Возвращает ближайшее Date или DateTime большее или равное dt с разрешением p.
Для удобства, p может быть типом вместо значения: ceil(dt, Dates.Hour) является сокращением для ceil(dt, Dates.Hour(1)).
julia> ceil(Date(1985, 8, 16), Dates.Month) 1985-09-01 julia> ceil(DateTime(2013, 2, 13, 0, 31, 20), Dates.Minute(15)) 2013-02-13T00:45:00 julia> ceil(DateTime(2016, 8, 6, 12, 0, 0), Dates.Day) 2016-08-07T00:00:00исходный код
Base.roundМетод
round(dt::TimeType, p::Period, [r::RoundingMode]) -> TimeType
Возвращает ближайшее Date или DateTime к dt с разрешением p. По умолчанию (RoundNearestTiesUp), при равенстве (например, округление 9:30 до ближайшего часа) выполняется округление вверх.
Для удобства, p может быть типом вместо значения: round(dt, Dates.Hour) является сокращением для round(dt, Dates.Hour(1)).
julia> round(Date(1985, 8, 16), Dates.Month) 1985-08-01 julia> round(DateTime(2013, 2, 13, 0, 31, 20), Dates.Minute(15)) 2013-02-13T00:30:00 julia> round(DateTime(2016, 8, 6, 12, 0, 0), Dates.Day) 2016-08-07T00:00:00
Допустимые режимы округления для round(::TimeType, ::Period, ::RoundingMode) — RoundNearestTiesUp (по умолчанию), RoundDown (floor) и RoundUp (ceil).
Большинство значений Period также можно округлить до заданного разрешения:
Base.floorМетод
floor(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> T
Округляет x вниз до ближайшего кратного precision . Если x и precision являются разными подтипами Period, значение результата будет иметь тот же тип, что и precision.
Для удобства, precision может быть типом вместо значения: floor(x, Dates.Hour) является сокращением для floor(x, Dates.Hour(1)).
julia> floor(Dates.Day(16), Dates.Week) 2 weeks julia> floor(Dates.Minute(44), Dates.Minute(15)) 30 minutes julia> floor(Dates.Hour(36), Dates.Day) 1 day
Округление до кратного precision Month или Year не поддерживается, так как эти Period имеют непостоянную длину.
Base.ceilМетод
ceil(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> T
Округляет x вверх до ближайшего кратного precision . Если x и precision являются разными подтипами Period, значение результата будет иметь тот же тип, что и precision.
Для удобства, precision может быть типом вместо значения: ceil(x, Dates.Hour) является сокращением для ceil(x, Dates.Hour(1)).
julia> ceil(Dates.Day(16), Dates.Week) 3 weeks julia> ceil(Dates.Minute(44), Dates.Minute(15)) 45 minutes julia> ceil(Dates.Hour(36), Dates.Day) 2 days
Округление до кратного precision Month или Year не поддерживается, так как эти Period имеют непостоянную длину.
Base.roundМетод
round(x::Period, precision::T, [r::RoundingMode]) where T <: Union{TimePeriod, Week, Day} -> T
Округлить x до ближайшего кратного precision. Если x и precision являются различными подтипами Period, возвращаемое значение будет иметь тот же тип, что и precision. По умолчанию (RoundNearestTiesUp) значения, которые должны быть округлены (например, округление 90 минут до ближайшего часа), будут округляться вверх.
Для удобства precision может быть типом, а не значением: round(x, Dates.Hour) — это сокращение для round(x, Dates.Hour(1)).
julia> round(Dates.Day(16), Dates.Week) 2 weeks julia> round(Dates.Minute(44), Dates.Minute(15)) 45 minutes julia> round(Dates.Hour(36), Dates.Day) 2 days
Допустимые режимы округления для round(::Period, ::T, ::RoundingMode) — это RoundNearestTiesUp (по умолчанию), RoundDown (floor) и RoundUp (ceil).
Округление до precision кратных Month или Year не поддерживается, так как эти Period имеют непостоянную длину.
Следующие функции не экспортируются:
Dates.floorceilФункция
floorceil(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Функция
epochdays2date(days) -> Date
Принимает количество дней с момента эпохи округления (0000-01-01T00:00:00) и возвращает соответствующую Date.
Dates.epochms2datetimeФункция
epochms2datetime(milliseconds) -> DateTime
Принимает количество миллисекунд с момента эпохи округления (0000-01-01T00:00:00) и возвращает соответствующую DateTime.
Dates.date2epochdaysФункция
date2epochdays(dt::Date) -> Int64
Принимает заданную Date и возвращает количество дней с момента эпохи округления (0000-01-01T00:00:00) как Int64.
Dates.datetime2epochmsФункция
datetime2epochms(dt::DateTime) -> Int64
Принимает заданную DateTime и возвращает количество миллисекунд с момента эпохи округления (0000-01-01T00:00:00) как Int64.
Функции преобразования
Dates.todayФункция
today() -> Date
Возвращает дату из now().
Dates.unix2datetimeФункция
unix2datetime(x) -> DateTime
Принимает количество секунд с момента эпохи Unix 1970-01-01T00:00:00 и преобразует в соответствующую DateTime.
Dates.datetime2unixФункция
datetime2unix(dt::DateTime) -> Float64
Принимает заданную DateTime и возвращает количество секунд с момента эпохи Unix 1970-01-01T00:00:00 как Float64.
Dates.julian2datetimeФункция
julian2datetime(julian_days) -> DateTime
Принимает количество дней юлианского календаря с момента эпохи -4713-11-24T12:00:00 и возвращает соответствующую DateTime.
Dates.datetime2julianФункция
datetime2julian(dt::DateTime) -> Float64
Принимает заданную DateTime и возвращает количество дней юлианского календаря с момента юлианской эпохи -4713-11-24T12:00:00 как Float64.
Dates.rata2datetimeФункция
rata2datetime(days) -> DateTime
Принимает количество дней Rata Die с момента эпохи 0000-12-31T00:00:00 и возвращает соответствующую DateTime.
Dates.datetime2rataФункция
datetime2rata(dt::TimeType) -> Int64
Возвращает количество дней Rata Die с момента эпохи, начиная с заданной Date или DateTime.
Константы
Дни недели:
| Переменная | Сокр. | Значение (Int) |
|---|---|---|
Monday |
Mon |
1 |
Tuesday |
Tue |
2 |
Wednesday |
Wed |
3 |
Thursday |
Thu |
4 |
Friday |
Fri |
5 |
Saturday |
Sat |
6 |
Sunday |
Sun |
7 |
Месяцы года:
| Переменная | Сокр. | Значение (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 |
Общие форматировщики дат
Dates.ISODateTimeFormatКонстанта
Dates.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Константа
Dates.ISODateFormat
Описывает формат ISO8601 для даты. Это значение по умолчанию для Dates.format объекта Date.
Пример
julia> Dates.format(Date(2018, 8, 8), ISODateFormat) "2018-08-08"исходный код
Dates.ISOTimeFormatКонстанта
Dates.ISOTimeFormat
Описывает формат ISO8601 для времени. Это значение по умолчанию для Dates.format объекта Time.
Пример
julia> Dates.format(Time(12, 0, 43, 1), ISOTimeFormat) "12:00:43.001"исходный код
Dates.RFC1123FormatКонстанта
Dates.RFC1123Format
Описывает формат RFC1123 для даты и времени.
Пример
julia> Dates.format(DateTime(2018, 8, 8, 12, 0, 43, 1), RFC1123Format) "Wed, 08 Aug 2018 12:00:43"исходный код
-
1Понятие UT-секунды на самом деле довольно фундаментально. Существуют в основном два разных понятия времени, которые обычно принимаются: одно основано на физическом вращении Земли (один полный оборот = 1 день), другое основано на СИ-секунде (фиксированное, постоянное значение). Эти понятия радикально отличаются! Подумайте об этом: «UT-секунда», определяемая относительно вращения Земли, может иметь разную абсолютную длину в зависимости от дня! В любом случае, то, что
DateиDateTimeоснованы на UT-секундах, является упрощающим, но честным допущением, чтобы избежать сложностей, связанных с секундами високосных лет и тому подобным. Эта основа времени формально называется UT или UT1. Основание типов на UT-секундах в основном означает, что каждая минута имеет 60 секунд, а каждый день – 24 часа, что приводит к более естественным вычислениям при работе с календарными датами.
© 2009–2021 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.7.0/stdlib/Dates/