Даты
Модуль 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 н. э.). Пустая строка, однако, всегда вызывает ArgumentError.
Слоты с фиксированной шириной задаются путем повторения символа периода столько раз, сколько это соответствует ширине без разделителя между символами. Таким образом, 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.
До Julia 1.9 пустые строки можно было передавать в конструкторы и parse без ошибки, возвращая соответствующие значения DateTime(1), Date(1) или Time(0). Аналогично, tryparse не возвращало nothing.
Полный набор тестов и примеров парсинга и форматирования доступен в 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_months_abbrev = ["janv","févr","mars","avril","mai","juin",
"juil","août","sept","oct","nov","déc"];
julia> french_days = ["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"];
julia> Dates.LOCALES["french"] = Dates.DateLocale(french_months, french_months_abbrev, french_days, [""]);
Затем указанные выше функции могут быть использованы для выполнения запросов:
julia> Dates.dayname(t;locale="french") "vendredi" julia> Dates.monthname(t;locale="french") "janvier" julia> Dates.monthabbr(t;locale="french") "janv"
Поскольку сокращенные версии дней не загружены, попытка использования функции dayabbr вызовет ошибку.
julia> Dates.dayabbr(t;locale="french")
ERROR: BoundsError: attempt to access 1-element Vector{String} at index [5]
Stacktrace:
[...]
Арифметика TimeType-Period
Важно при работе с любым языком/фреймворком для работы с датами понимать, как обрабатывается арифметика дата-период, поскольку существуют некоторые сложные вопросы (хотя для типов точности дня они значительно менее сложные).
Подход модуля 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 до четного кратного месяцев приведет к тому, что поле месяцев будет иметь нечетное значение. Поскольку и месяцы, и годы могут содержать неравное число дней, неясно, приведет ли округление до четного числа дней к четному значению в поле дней.
Дополнительную информацию о методах, экспортированных из модуля 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 представляет точку во времени в соответствии с пролептическим григорианским календарем. Наименьшее разрешение времени составляет миллисекунда (микросекунды или наносекунды не могут быть представлены этим типом). Тип поддерживает арифметику с плавающей запятой и, следовательно, подвержен подпотоку (и переполнению). Заметным следствием является округление при добавлении Microsecond или Nanosecond:
julia> dt = DateTime(2023, 8, 19, 17, 45, 32, 900) 2023-08-19T17:45:32.900 julia> dt + Millisecond(1) 2023-08-19T17:45:32.901 julia> dt + Microsecond(1000) # 1000us == 1ms 2023-08-19T17:45:32.901 julia> dt + Microsecond(999) # 999us rounded to 1000us 2023-08-19T17:45:32.901 julia> dt + Microsecond(1499) # 1499 rounded to 1000us 2023-08-19T17:45:32.901
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 -> second(dt) == 40, 2010, 10, 20, 10; step = Second(1)) 2010-10-20T10:00:40 julia> DateTime(dt -> hour(dt) == 20, 2010, 10, 20, 10; step = Hour(1), limit = 5) ERROR: ArgumentError: 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 | То же, что и Y в parse, но отбрасывает избыточные цифры в format |
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 | Совпадение с AM/PM (регистр не учитывается) |
yyyymmdd |
19960101 | Совпадение с фиксированной шириной года, месяца и дня |
Символы, не указанные выше, обычно рассматриваются как разделители между частями даты и времени. Например, строка "1996-01-15T00:00:00.0" будет иметь строку формата "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-dd\THH: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 -> week(date) == 20, 2010, 01, 01) 2010-05-17 julia> Date(date -> year(date) == 2010, 2000, 01, 01) 2010-01-01 julia> Date(date -> month(date) == 10, 2000, 01, 01; limit = 5) ERROR: ArgumentError: 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> Time(t -> minute(t) == 30, 20) 20:30:00 julia> Time(t -> minute(t) == 0, 20) 20:00:00 julia> Time(t -> hour(t) == 10, 3; limit = 5) ERROR: ArgumentError: 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. Для других часовых поясов используйте пакет TimeZones.jl.
Примеры
julia> now(UTC) 2023-01-04T10:52:24.864
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> week(Date(1989, 6, 22)) 25 julia> week(Date(2005, 1, 1)) 53 julia> 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> dayname(Date("2000-01-01"))
"Saturday"
julia> dayname(4)
"Thursday"
Dates.dayabbrФункция
dayabbr(dt::TimeType; locale="english") -> String dayabbr(day::Integer; locale="english") -> String
Возвращает сокращённое название дня недели для Date или DateTime в заданной locale. Также принимает Integer.
Примеры
julia> dayabbr(Date("2000-01-01"))
"Sat"
julia> dayabbr(3)
"Wed"
Dates.dayofweekФункция
dayofweek(dt::TimeType) -> Int64
Возвращает номер дня недели в виде Int64 с 1 = Monday, 2 = Tuesday, etc..
Примеры
julia> 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> dayofweekofmonth(Date("2000-02-01"))
1
julia> dayofweekofmonth(Date("2000-02-08"))
2
julia> dayofweekofmonth(Date("2000-02-15"))
3
Dates.daysofweekinmonthФункция
daysofweekinmonth(dt::TimeType) -> Int
Для дня недели dt, вернуть общее количество этого дня недели в месяце dt. Возвращает 4 или 5. Полезно в временных выражениях для указания последнего дня недели в месяце, включив dayofweekofmonth(dt) == daysofweekinmonth(dt) в функцию корректировки.
Примеры
julia> daysofweekinmonth(Date("2005-01-01"))
5
julia> daysofweekinmonth(Date("2005-01-04"))
4
Dates.monthnameФункция
monthname(dt::TimeType; locale="english") -> String monthname(month::Integer, locale="english") -> String
Вернуть полное имя месяца Date или DateTime или Integer в заданном locale.
Примеры
julia> monthname(Date("2005-01-04"))
"January"
julia> monthname(2)
"February"
Dates.monthabbrФункция
monthabbr(dt::TimeType; locale="english") -> String monthabbr(month::Integer, locale="english") -> String
Вернуть сокращенное имя месяца Date или DateTime или Integer в заданном locale.
Примеры
julia> monthabbr(Date("2005-01-04"))
"Jan"
julia> monthabbr(2)
"Feb"
Dates.daysinmonthФункция
daysinmonth(dt::TimeType) -> Int
Вернуть количество дней в месяце dt. Значение будет 28, 29, 30 или 31.
Примеры
julia> daysinmonth(Date("2000-01"))
31
julia> daysinmonth(Date("2001-02"))
28
julia> daysinmonth(Date("2000-02"))
29
Dates.isleapyearФункция
isleapyear(dt::TimeType) -> Bool
Вернуть true, если год dt является високосным.
Примеры
julia> isleapyear(Date("2004"))
true
julia> isleapyear(Date("2005"))
false
Dates.dayofyearФункция
dayofyear(dt::TimeType) -> Int
Вернуть день года для dt, где 1 января — день 1.
Dates.daysinyearФункция
daysinyear(dt::TimeType) -> Int
Вернуть 366, если год dt високосный, иначе вернуть 365.
Примеры
julia> daysinyear(1999) 365 julia> 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(DateTime("1996-01-01T12:30:00"), Day)
1996-01-01T00:00:00
Dates.firstdayofweekФункция
firstdayofweek(dt::TimeType) -> TimeType
Корректирует dt до понедельника своей недели.
Примеры
julia> firstdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-01T00:00:00
Dates.lastdayofweekФункция
lastdayofweek(dt::TimeType) -> TimeType
Корректирует dt до воскресенья своей недели.
Примеры
julia> lastdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-07T00:00:00
Dates.firstdayofmonthФункция
firstdayofmonth(dt::TimeType) -> TimeType
Корректирует dt к первому дню месяца.
Примеры
julia> firstdayofmonth(DateTime("1996-05-20"))
1996-05-01T00:00:00
Dates.lastdayofmonthФункция
lastdayofmonth(dt::TimeType) -> TimeType
Корректирует dt к последнему дню месяца.
Примеры
julia> lastdayofmonth(DateTime("1996-05-20"))
1996-05-31T00:00:00
Dates.firstdayofyearФункция
firstdayofyear(dt::TimeType) -> TimeType
Корректирует dt к первому дню года.
Примеры
julia> firstdayofyear(DateTime("1996-05-20"))
1996-01-01T00:00:00
Dates.lastdayofyearФункция
lastdayofyear(dt::TimeType) -> TimeType
Корректирует dt к последнему дню года.
Примеры
julia> lastdayofyear(DateTime("1996-05-20"))
1996-12-31T00:00:00
Dates.firstdayofquarterФункция
firstdayofquarter(dt::TimeType) -> TimeType
Корректирует dt к первому дню квартала.
Примеры
julia> firstdayofquarter(DateTime("1996-05-20"))
1996-04-01T00:00:00
julia> firstdayofquarter(DateTime("1996-08-20"))
1996-07-01T00:00:00
Dates.lastdayofquarterФункция
lastdayofquarter(dt::TimeType) -> TimeType
Корректирует dt к последнему дню квартала.
Примеры
julia> lastdayofquarter(DateTime("1996-05-20"))
1996-06-30T00:00:00
julia> lastdayofquarter(DateTime("1996-08-20"))
1996-09-30T00:00:00
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 к первому дню месяца. В качестве альтернативы, of=Year будет скорректировано к первому дню года.
Dates.tolastФункция
tolast(dt::TimeType, dow::Int; of=Month) -> TimeType
Корректирует dt к последнему дню месяца. В качестве альтернативы, of=Year будет скорректировано к последнему дню года.
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 к канонической форме, применяя следующие правила:
- Любой
Periodдостаточно большой, чтобы частично представиться более грубымPeriod, будет разбит на несколькоPeriod(например,Hour(30)становитсяDay(1) + Hour(6)) -
Periodс противоположными знаками будут объединены, когда это возможно (например,Hour(1) - Day(1)становится-Hour(23))
Примеры
julia> canonicalize(Dates.CompoundPeriod(Dates.Hour(12), Dates.Hour(13))) 1 day, 1 hour julia> canonicalize(Dates.CompoundPeriod(Dates.Hour(-1), Dates.Minute(1))) -59 minutes julia> canonicalize(Dates.CompoundPeriod(Dates.Month(1), Dates.Week(-2))) 1 month, -2 weeks julia> 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), Month) 1985-08-01 julia> floor(DateTime(2013, 2, 13, 0, 31, 20), Minute(15)) 2013-02-13T00:30:00 julia> floor(DateTime(2016, 8, 6, 12, 0, 0), Day) 2016-08-06T00:00:00
Base.ceilМетод
ceil(dt::TimeType, p::Period) -> TimeType
Возвращает ближайшее Date или DateTime значение, большее или равное dt с разрешением p.
Для удобства, p может быть типом вместо значения: ceil(dt, Dates.Hour) — это сокращение для ceil(dt, Dates.Hour(1)).
julia> ceil(Date(1985, 8, 16), Month) 1985-09-01 julia> ceil(DateTime(2013, 2, 13, 0, 31, 20), Minute(15)) 2013-02-13T00:45:00 julia> ceil(DateTime(2016, 8, 6, 12, 0, 0), Day) 2016-08-07T00:00:00
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), Month) 1985-08-01 julia> round(DateTime(2013, 2, 13, 0, 31, 20), Minute(15)) 2013-02-13T00:30:00 julia> round(DateTime(2016, 8, 6, 12, 0, 0), Day) 2016-08-07T00:00:00
Допустимые режимы округления для round(::TimeType, ::Period, ::RoundingMode) — это RoundNearestTiesUp (по умолчанию), RoundDown (floor) и RoundUp (ceil).
Большинство значений Period также можно округлить до заданного разрешения:
Base.floorМетод
floor(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> T
Округляет x вниз до ближайшего кратного precision. Если x и precision являются различными подтипами Period, возвращаемое значение будет иметь тот же тип, что и precision.
Для удобства, precision может быть типом вместо значения: floor(x, Dates.Hour) — это сокращение для floor(x, Dates.Hour(1)).
julia> floor(Day(16), Week) 2 weeks julia> floor(Minute(44), Minute(15)) 30 minutes julia> floor(Hour(36), 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(Day(16), Week) 3 weeks julia> ceil(Minute(44), Minute(15)) 45 minutes julia> ceil(Hour(36), Day) 2 days
Округление до кратного precision Month или Year не поддерживается, так как эти Period имеют разную длину.
Base.roundМетод
round(x::Period, precision::T, [r::RoundingMode]) where T <: Union{TimePeriod, Week, Day} -> T
Округляет x до ближайшего кратного precision. Если x и precision являются различными подтипами Period, возвращаемое значение будет иметь тот же тип, что и precision. По умолчанию (RoundNearestTiesUp), в случае равенства (например, округление 90 минут до ближайшего часа) округление будет выполняться в большую сторону.
Для удобства, precision может быть типом вместо значения: round(x, Dates.Hour) — это сокращение для round(x, Dates.Hour(1)).
julia> round(Day(16), Week) 2 weeks julia> round(Minute(44), Minute(15)) 45 minutes julia> round(Hour(36), Day) 2 days
Допустимые режимы округления для round(::Period, ::T, ::RoundingMode) — это RoundNearestTiesUp (по умолчанию), RoundDown (floor) и RoundUp (ceil).
Округление до кратного precision 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.
Константы
Дни недели:
| Переменная | Аббр. | Значение (Целое) |
|---|---|---|
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–2024 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.11/stdlib/Dates/