Даты
Модуль 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 имеет свои особенности касательно дат до нашей эры. В общем случае, последним днём эры до нашей эры, 1-12-31 до н.э., следовал 1-1-1 н.э., поэтому года ноль не существует. Однако стандарт 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
Представление периодов или продолжительностей, которые не являются целыми кратными основных типов, может быть достигнуто с помощью типа Dates.CompoundPeriod. Составные периоды можно создать вручную из простых типов Period. Кроме того, функция canonicalize может использоваться для разбиения периода на Dates.CompoundPeriod. Это особенно полезно для преобразования продолжительности, например, разницы между двумя 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
Округление
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.) Более подробная информация о доступных режимах RoundingMode находится в справочнике 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.
Поскольку значения Date и DateTime в Julia представлены в соответствии со стандартом ISO 8601, 0000-01-01T00:00:00 был выбран в качестве базового (или «эпохи округления») для начала отсчёта дней (и миллисекунд) в расчётах округления. (Обратите внимание, что это немного отличается от внутреннего представления Date в Julia с использованием нотации 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 до чётного кратного месяцев приведёт к нечётному значению в поле месяца. Поскольку и месяцы, и годы могут содержать нерегулярное количество дней, невозможно точно сказать, приведёт ли округление до чётного числа дней к чётному значению в поле дней.
См. справочник API для получения дополнительной информации о методах, экспортированных из модуля Dates.
Справочник 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.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: "yyyy-mm-ddTHH:MM:SS". Обратите внимание, что если вам нужно использовать символ кода как литеранльный, вы можете использовать символ обратного слеша. Строка "1996y01m" может быть получена с форматом "yyyy\ymm\m".
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 |
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Макрос
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"yyyy-mm-ddTHH:MM:SS.s" при отсутствии.
Аналогично 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, или 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, или с форматом "ЧЧ:ММ:СС.мс" по умолчанию.
Аналогично 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.canonicalizeФункция
canonicalize(::CompoundPeriod) -> CompoundPeriod
Приводит период CompoundPeriod к канонической форме, применяя следующие правила:
- Любой период, достаточно большой, чтобы быть частично представлен более грубым периодом, будет разбит на несколько периодов (например,
Hour(30)становитсяDay(1) + Hour(6)) -
Периоды с противоположными знаками будут объединены, когда это возможно (например,
Hour(1) - Day(1)становится-Hour(23))
Примеры
julia> Dates.canonicalize(Dates.CompoundPeriod(Dates.Hour(12), Dates.Hour(13))) 1 day, 1 hour julia> Dates.canonicalize(Dates.CompoundPeriod(Dates.Hour(-1), Dates.Minute(1))) -59 minutes julia> Dates.canonicalize(Dates.CompoundPeriod(Dates.Month(1), Dates.Week(-2))) 1 month, -2 weeks julia> Dates.canonicalize(Dates.CompoundPeriod(Dates.Minute(50000))) 4 weeks, 6 days, 17 hours, 20 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
Принимает количество дней Рата Дие с эпохи 0000-12-31T00:00:00 и возвращает соответствующую DateTime.
Dates.datetime2rataФункция
datetime2rata(dt::TimeType) -> Int64
Возвращает количество дней Рата Дие с эпохи от заданной Date или DateTime.
Константы
Дни недели:
| Переменная | Сокращ. | Значение (Int) |
|---|---|---|
Monday |
Mon |
1 |
Tuesday |
Tue |
2 |
Wednesday |
Wed |
3 |
Thursday |
Thu |
4 |
Friday |
Fri |
5 |
Saturday |
Sat |
6 |
Sunday |
Sun |
7 |
Месяцы года:
| Переменная | Сокр. | Значение (Целое) |
|---|---|---|
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 |
Форматы дат
Формат даты и времени ISO8601Константа
Dates.ISODateTimeFormat
Описывает форматирование даты и времени согласно ISO8601. Это значение по умолчанию для Dates.format DateTime.
Пример
julia> Dates.format(DateTime(2018, 8, 8, 12, 0, 43, 1), ISODateTimeFormat) "2018-08-08T12:00:43.001"
Формат даты ISO8601Константа
Dates.ISODateFormat
Описывает форматирование даты согласно ISO8601. Это значение по умолчанию для Dates.format Date.
Пример
julia> Dates.format(Date(2018, 8, 8), ISODateFormat) "2018-08-08"
Формат времени ISO8601Константа
Dates.ISOTimeFormat
Описывает форматирование времени согласно ISO8601. Это значение по умолчанию для Dates.format Time.
Пример
julia> Dates.format(Time(12, 0, 43, 1), ISOTimeFormat) "12:00:43.001"
Формат даты и времени RFC1123Константа
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–2022 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.8/stdlib/Dates/