Даты
Модуль 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), слоты с разделителями позволяют пропускать части дат и времён при условии, что заданы предыдущие части. Остальные части получают обычные значения по умолчанию. Например, 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_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
Функции корректировки
Как бы удобной ни была арифметика с датами и периодами, часто для вычислений с датами требуются календарные или временные характеристики, а не фиксированное количество периодов. Праздники — идеальный пример; большинство из них следуют правилам, таким как «День памяти = Последний понедельник мая» или «День благодарения = 4-я четверг ноября». Эти временные выражения оперируют правилами, относящимися к календарю, такими как начало или конец месяца, следующий вторник или первый и третий среды и т. д.
Модуль Dates предоставляет API корректировки через несколько удобных методов, которые помогают просто и кратко выразить временные правила. Первая группа методов корректировки связана с началом и концом недель, месяцев, кварталов и годов. Каждый из них принимает на вход единственный TimeType и возвращает или корректирует до начала или конца желаемого периода относительно ввода.
julia> Dates.firstdayofweek(Date(2014,7,16)) # Adjusts the input to the Monday of the input's week 2014-07-14 julia> Dates.lastdayofmonth(Date(2014,7,16)) # Adjusts to the last day of the input's month 2014-07-31 julia> Dates.lastdayofquarter(Date(2014,7,16)) # Adjusts to the last day of the input's quarter 2014-09-30
Следующие два метода высшего порядка, tonext и toprev, обобщают работу с временными выражениями, принимая DateFunction в качестве первого аргумента вместе с начальной TimeType. DateFunction — это просто функция, обычно анонимная, которая принимает единственный 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.
Так как значения Julia Date и DateTime представлены в соответствии со стандартом ISO 8601, 0000-01-01T00:00:00 был выбран в качестве базы (или «эпохи округления»), от которой начинать отсчёт дней (и миллисекунд), используемых в вычислениях округления. (Обратите внимание, что это немного отличается от внутренней интерпретации Julia значений Date с использованием записи «Rata Die»; но поскольку стандарт ISO 8601 наиболее виден конечному пользователю, 0000-01-01T00:00:00 был выбран в качестве эпохи округления вместо 0000-12-31T00:00:00 , используемого во внутренней реализации, чтобы минимизировать путаницу.)
Единственное исключение из использования 0000-01-01T00:00:00 в качестве эпохи округления — это округление до недель. Округление до ближайшей недели всегда будет возвращать понедельник (первый день недели, как указано в ISO 8601). По этой причине мы используем 0000-01-03T00:00:00 (первый день первой недели года 0000, как определено ISO 8601) в качестве базы при округления до количества недель.
Вот ещё один случай, в котором ожидаемое поведение не обязательно очевидно: Что происходит, когда мы округляем до ближайшего P(2), где P — тип Period? В некоторых случаях (в частности, когда P <: Dates.TimePeriod) ответ ясен:
julia> round(DateTime(2016, 7, 17, 8, 55, 30), Dates.Hour(2)) 2016-07-17T08:00:00 julia> round(DateTime(2016, 7, 17, 8, 55, 30), Dates.Minute(2)) 2016-07-17T08:56:00
Это кажется очевидным, потому что два периода каждого из них по-прежнему делятся нацело на следующий более крупный период. Но в случае двух месяцев (которые по-прежнему делятся нацело на один год), ответ может удивить:
julia> round(DateTime(2016, 7, 17, 8, 55, 30), Dates.Month(2)) 2016-07-01T00:00:00
Почему округляется до первого дня июля, даже если это месяц 7 (нечётное число)? Суть в том, что месяцам присваивается индекс 1 (первый месяц имеет индекс 1), в отличие от часов, минут, секунд и миллисекунд (первый из которых имеет индекс 0).
Это означает, что округление DateTime до чётного кратного секундам, минутам, часам или годам (поскольку спецификация ISO 8601 включает год ноль) приведёт к DateTime с чётным значением в этом поле, а округление DateTime до чётного кратного месяцам приведёт к нечётной величине в поле месяца. Поскольку и месяцы, и годы могут содержать нерегулярное количество дней, невозможно точно сказать, приведёт ли округление до чётного количества дней к чётному значению в поле дней.
Дополнительную информацию о методах, экспортированных из модуля Dates, см. в справочнике API.
Справочник API
Типы дат и времени
Dates.PeriodТип
Period Year Quarter Month Week Day Hour Minute Second Millisecond Microsecond Nanosecond
Period типы представляют дискретные, человеко-читаемые представления времени.
Dates.CompoundPeriodТип
CompoundPeriod
CompoundPeriod полезен для выражения временных отрезков, которые не являются фиксированным кратным меньшим временным отрезкам. Например, "год и один день" не является фиксированным числом дней, но может быть выражено с помощью CompoundPeriod. На самом деле, CompoundPeriod автоматически генерируется путём сложения различных типов периодов, например, Year(1) + Day(1) даёт результат CompoundPeriod.
Dates.InstantТип
Instant
Instant типы представляют целочисленные, машинные представления времени как непрерывные временные шкалы, начинающиеся с эпохи.
Dates.UTInstantТип
UTInstant{T}
UTInstant представляет собой машинную временную шкалу, основанную на времени UT (1 день = один оборот Земли). T является параметром Period , который указывает на разрешение или точность момента.
Dates.TimeTypeТип
TimeType
TimeType типы обертывают Instant машинные экземпляры, чтобы предоставить человеко-читаемые представления машинного момента. Time, DateTime и Date являются подтипами TimeType.
Dates.DateTimeТип
DateTime
DateTime обертывает UTInstant{Millisecond} и интерпретирует его в соответствии с пролептическим григорианским календарём.
Dates.DateТип
Date
Date обертывает UTInstant{Day} и интерпретирует его в соответствии с пролептическим григорианским календарём.
Dates.TimeТип
Time
Time обертывает Nanosecond и представляет собой конкретный момент в 24-часовом дне.
Dates.TimeZoneТип
TimeZone
Географическая зона, как правило, основанная на долготе, определяющая время в определённом месте. Некоторые часовые пояса соблюдают летнее время (например, EST -> EDT). Для реализации и дополнительной поддержки см. пакет TimeZones.jl
Dates.UTCТип
UTC
UTC, или Координированное универсальное время, является TimeZone, от которого отсчитываются все остальные. Оно связано со временем в 0° долготы. Оно не скорректировано на летнее время.
Функции дат
Dates.DateTimeМетод
DateTime(y, [m, d, h, mi, s, ms]) -> DateTime
Создаёт тип DateTime по частям. Аргументы должны быть преобразуемы в Int64.
Dates.DateTimeМетод
DateTime(periods::Period...) -> DateTime
Создаёт тип DateTime по частям типа Period. Аргументы могут быть в любом порядке. Части Dates.default(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: "yyyy-mm-ddTHH:MM:SS". Обратите внимание, что если вам нужно использовать кодовый символ как литерал, вы можете использовать символ обратного слэша в качестве escape-символа. Строка "1996y01m" может быть получена с форматом "yyyy\ymm\m".
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 |
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 | Соответствует году, месяцу и дню с фиксированной шириной |
Символы, не перечисленные выше, обычно обрабатываются как разделители между частями даты и времени. Например, строка "1996-01-15T00:00:00.0" будет иметь строку формата "y-m-dTH:M:S.s". Если вам нужно использовать символ кода в качестве разделителя, вы можете экранировать его с помощью обратного слэша. Дата "1995y01m" будет иметь формат "y\ym\m".
Обратите внимание, что 12:00 AM соответствует 00:00 (полночь), а 12:00 PM соответствует 12:00 (полдень). При анализе времени со спецификатором p, любая цифра часа (как H, так и I) интерпретируется как 12-часовой формат, поэтому код I в основном полезен для вывода.
Создание объекта DateFormat требует ресурсов. Всякий раз, когда это возможно, создайте его один раз и используйте многократно или попробуйте использовать макрос строки dateformat"". Использование этого макроса создает объект DateFormat один раз во время расширения макроса и повторно использует его позже. Также доступны несколько предопределенных форматировщиков, перечисленных позже.
См. DateTime и format, чтобы узнать, как использовать объект DateFormat для анализа и записи строк дат соответственно.
Dates.@dateformat_strМакрос
dateformat"Y-m-d H:M:S"
Создайте объект DateFormat. Аналогично DateFormat("Y-m-d H:M:S"), но создает объект DateFormat один раз во время расширения макроса.
См. DateFormat для получения подробной информации о спецификаторах формата.
Dates.DateTimeМетод
DateTime(dt::AbstractString, df::DateFormat=ISODateTimeFormat) -> DateTime
Создайте объект DateTime, проанализировав строку даты и времени dt по шаблону, заданному объектом DateFormat, или "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, или по умолчанию "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 до первого 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 Periods. Все 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 Periods, составляющих заданный 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 |
Форматы дат
Формат ISODateTimeКонстанта
Dates.ISODateTimeFormat
Описывает формат ISO8601 для даты и времени. Это значение по умолчанию для Dates.format в DateTime.
Пример
julia> Dates.format(DateTime(2018, 8, 8, 12, 0, 43, 1), ISODateTimeFormat) "2018-08-08T12:00:43.001"
Формат ISODateКонстанта
Dates.ISODateFormat
Описывает формат ISO8601 для даты. Это значение по умолчанию для Dates.format в Date.
Пример
julia> Dates.format(Date(2018, 8, 8), ISODateFormat) "2018-08-08"
Формат ISOTimeКонстанта
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.10/stdlib/Dates/