Spec-Zone.ru › Julia 1.7

Даты

Модуль Dates предоставляет два типа для работы с датами: Date и DateTime, представляющие точность дня и миллисекунды соответственно; оба являются подтипами абстрактного TimeType. Мотивация для разных типов проста: некоторые операции намного проще, как с точки зрения кода, так и с точки зрения логического мышления, когда не нужно учитывать сложность большей точности. Например, так как тип Date разрешается только до точности одной даты (т.е. без часов, минут или секунд), обычные соображения по часовым поясам, летнему/зимнему времени и високосным секундам не нужны и не используются.

Оба типа Date и DateTime в основном являются неизменяемыми обёртками Int64. Единственное поле instant любого типа на самом деле является типом UTInstant{P}, который представляет непрерывно возрастающую временную шкалу машины, основанную на секунде UT [1]. Тип DateTime не учитывает часовые пояса (неявный, по терминологии Python), аналогично LocalDateTime в Java 8. Дополнительную функциональность часовых поясов можно добавить с помощью пакета TimeZones.jl, который компилирует базу данных часовых поясов IANA. Оба типа Date и DateTime основаны на стандарте ISO 8601, который следует пролептическому григорианскому календарю. Отметим, что стандарт ISO 8601 чётко определяет даты до н.э. / до н. э. В общем, последний день эпохи до н.э. / до н. э., 31-12-01 до н. э. / до н. э., был заменён на 01-01-01 н. э. / н. э., поэтому года нуль не существует. Однако стандарт ISO гласит, что 1 до н.э. / до н. э. – это год нуль, поэтому 0000-12-31 – это день перед 0001-01-01, а год -0001 (да, минус один для года) – это 2 до н.э. / до н. э., год -0002 – это 3 до н.э. / до н. э. и т.д.

Конструкторы

Date и DateTime типы могут быть созданы с помощью целых чисел или Period типов, путём парсинга или через корректоры (подробнее об этом позже):

julia> DateTime(2013)
2013-01-01T00:00:00

julia> DateTime(2013,7)
2013-07-01T00:00:00

julia> DateTime(2013,7,1)
2013-07-01T00:00:00

julia> DateTime(2013,7,1,12)
2013-07-01T12:00:00

julia> DateTime(2013,7,1,12,30)
2013-07-01T12:30:00

julia> DateTime(2013,7,1,12,30,59)
2013-07-01T12:30:59

julia> DateTime(2013,7,1,12,30,59,1)
2013-07-01T12:30:59.001

julia> Date(2013)
2013-01-01

julia> Date(2013,7)
2013-07-01

julia> Date(2013,7,1)
2013-07-01

julia> Date(Dates.Year(2013),Dates.Month(7),Dates.Day(1))
2013-07-01

julia> Date(Dates.Month(7),Dates.Year(2013))
2013-07-01

Date или DateTime парсинг выполняется с помощью форматов строк. Форматы строк работают путём определения разграниченных или фиксированных "слотов", содержащих период для парсинга, и передачей текста для парсинга и строку формата в конструктор Date или DateTime, в форме Date("2015-01-01",dateformat"y-m-d") или DateTime("20150101",dateformat"yyyymmdd").

Разграниченные слоты отмечаются указанием разделителя, который ожидается парсером между двумя последующими периодами; таким образом, "y-m-d" позволяет парсеру понять, что между первым и вторым слотом в строке даты, например, "2014-07-16", он должен найти символ -.

Символы y, m, и d позволяют парсеру понять, какие периоды необходимо обработать в каждом слоте.

Как и в случае с конструкторами выше, такими как Date(2013), разграниченные DateFormat позволяют пропускать части дат и времени, пока предыдущие части указаны. Другие части принимают значения по умолчанию. Например, Date("1981-03", dateformat"y-m-d") возвращает 1981-03-01, в то время как Date("31/12", dateformat"d/m/y") даёт 0001-12-31. (Обратите внимание, что значение года по умолчанию - 1 н. э.). Следовательно, пустая строка всегда возвращает 0001-01-01 для Date и 0001-01-01T00:00:00.000 для DateTime.

Фиксированные слоты задаются путём повторения символа периода количество раз, соответствующее ширине без разделителя между символами. Таким образом, dateformat"yyyymmdd" соответствует строке даты, например, "20140716". Парсер различает фиксированный слот отсутствием разделителя, отмечая переход "yyyymm" от одного символа периода к другому.

Поддерживается также парсинг месяцев в текстовой форме с помощью символов u и U для сокращённых и полных названий месяцев соответственно. По умолчанию поддерживаются только английские названия месяцев, поэтому u соответствует "Янв", "Фев", "Март" и т. д. А U соответствует "Январь", "Февраль", "Март" и т. д. Аналогично другим функциям сопоставления имя => значение dayname и monthname, пользовательские языковые настройки могут быть загружены путём передачи сопоставления locale=>Dict{String,Int} в словари MONTHTOVALUEABBR и MONTHTOVALUE для сокращённых и полных названий месяцев соответственно.

В приведенных выше примерах использовалась макрос-строка dateformat"". Этот макрос создаёт объект DateFormat один раз при развёртывании макроса и использует тот же объект DateFormat даже если фрагмент кода выполняется несколько раз.

julia> for i = 1:10^5
           Date("2015-01-01", dateformat"y-m-d")
       end

Или вы можете создать объект DateFormat явно:

julia> df = DateFormat("y-m-d");

julia> dt = Date("2015-01-01",df)
2015-01-01

julia> dt2 = Date("2015-01-02",df)
2015-01-02

В качестве альтернативы, используйте трансляцию:

julia> years = ["2015", "2016"];

julia> Date.(years, DateFormat("yyyy"))
2-element Vector{Date}:
 2015-01-01
 2016-01-01

Для удобства вы можете передать строку формата напрямую (например, Date("2015-01-01","y-m-d")), хотя эта форма влечёт за собой затраты производительности, если вы повторно обрабатываете тот же формат, так как внутри создаётся новый объект DateFormat каждый раз.

Кроме как через конструкторы, объект Date или DateTime можно создать из строк, используя функции parse и tryparse, но с необязательным третьим аргументом типа DateFormat, задающим формат; например, parse(Date, "06.23.2013", dateformat"m.d.y"), или tryparse(DateTime, "1999-12-31T23:59:59"), который использует формат по умолчанию. Существенное различие между функциями заключается в том, что при использовании tryparse ошибка не возникает, если строка имеет неверный формат; вместо этого возвращается nothing. Тем не менее, как и в конструкторах выше, пустые части дат и времени предполагают значения по умолчанию, и, следовательно, пустая строка ("") действительна для любой DateFormat, давая, например, Date 0001-01-01. Код, полагающийся на parse или tryparse для Date и DateTime парсинга, поэтому должен проверять, пуста ли входная строка перед использованием результата.

Полный набор тестов и примеров парсинга и форматирования доступен в stdlib/Dates/test/io.jl.

Длительности/Сравнения

Нахождение длительности между двумя Date или DateTime простая задача, учитывая их внутреннее представление как UTInstant{Day} и UTInstant{Millisecond} соответственно. Разница между Date возвращается в количестве Day, а DateTime – в количестве Millisecond.

Аналогично, сравнение TimeType – это простая задача сравнения базовых временных моментов (которые в свою очередь сравнивают внутренние значения Int64).

julia> dt = Date(2012,2,29)
2012-02-29

julia> dt2 = Date(2000,2,1)
2000-02-01

julia> dump(dt)
Date
  instant: Dates.UTInstant{Day}
    periods: Day
      value: Int64 734562

julia> dump(dt2)
Date
  instant: Dates.UTInstant{Day}
    periods: Day
      value: Int64 730151

julia> dt > dt2
true

julia> dt != dt2
true

julia> dt + dt2
ERROR: MethodError: no method matching +(::Date, ::Date)
[...]

julia> dt * dt2
ERROR: MethodError: no method matching *(::Date, ::Date)
[...]

julia> dt / dt2
ERROR: MethodError: no method matching /(::Date, ::Date)

julia> dt - dt2
4411 days

julia> dt2 - dt
-4411 days

julia> dt = DateTime(2012,2,29)
2012-02-29T00:00:00

julia> dt2 = DateTime(2000,2,1)
2000-02-01T00:00:00

julia> dt - dt2
381110400000 milliseconds

Функции доступа

Поскольку типы Date и DateTime хранятся как одиночные значения Int64, части или поля даты могут быть извлечены с помощью функций доступа. Маленькие функции доступа возвращают поле как целое число:

julia> t = Date(2014, 1, 31)
2014-01-31

julia> Dates.year(t)
2014

julia> Dates.month(t)
1

julia> Dates.week(t)
5

julia> Dates.day(t)
31

В то время как заглавные возвращают то же самое значение в соответствующем типе Period:

julia> Dates.Year(t)
2014 years

julia> Dates.Day(t)
31 days

Предлагаются составные методы, поскольку доступ к нескольким полям одновременно более эффективен, чем доступ к ним по отдельности:

julia> Dates.yearmonth(t)
(2014, 1)

julia> Dates.monthday(t)
(1, 31)

julia> Dates.yearmonthday(t)
(2014, 1, 31)

Также можно получить доступ к базовому значению UTInstant или целому числу:

julia> dump(t)
Date
  instant: Dates.UTInstant{Day}
    periods: Day
      value: Int64 735264

julia> t.instant
Dates.UTInstant{Day}(Day(735264))

julia> Dates.value(t)
735264

Функции запроса

Функции запроса предоставляют календарную информацию о TimeType. В них содержится информация о дне недели:

julia> t = Date(2014, 1, 31)
2014-01-31

julia> Dates.dayofweek(t)
5

julia> Dates.dayname(t)
"Friday"

julia> Dates.dayofweekofmonth(t) # 5th Friday of January
5

Месяце года:

julia> Dates.monthname(t)
"January"

julia> Dates.daysinmonth(t)
31

А также информация о годе и квартале TimeType:

julia> Dates.isleapyear(t)
false

julia> Dates.dayofyear(t)
31

julia> Dates.quarterofyear(t)
1

julia> Dates.dayofquarter(t)
31

Методы dayname и monthname также могут принимать необязательный ключевой параметр locale, который может быть использован для возвращения названия дня или месяца года для других языков/региональных настроек. Также существуют версии этих функций, возвращающие сокращённые названия, а именно dayabbr и monthabbr. Сначала сопоставление загружается в переменную LOCALES:

julia> french_months = ["janvier", "février", "mars", "avril", "mai", "juin",
                        "juillet", "août", "septembre", "octobre", "novembre", "décembre"];

julia> french_monts_abbrev = ["janv","févr","mars","avril","mai","juin",
                              "juil","août","sept","oct","nov","déc"];

julia> french_days = ["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"];

julia> Dates.LOCALES["french"] = Dates.DateLocale(french_months, french_monts_abbrev, french_days, [""]);

Затем упомянутые функции могут быть использованы для выполнения запросов:

julia> Dates.dayname(t;locale="french")
"vendredi"

julia> Dates.monthname(t;locale="french")
"janvier"

julia> Dates.monthabbr(t;locale="french")
"janv"

Так как сокращённые варианты дней не загружены, попытка использовать функцию dayabbr вызовет ошибку.

julia> Dates.dayabbr(t;locale="french")
ERROR: BoundsError: attempt to access 1-element Vector{String} at index [5]
Stacktrace:
[...]

Арифметика TimeType-Period

Когда вы работаете с любым языком/фреймворком для дат, полезно ознакомиться с тем, как обрабатывается арифметика дат и периодов, так как существуют некоторые сложные вопросы (хотя для типов с точностью до дня они намного менее сложны).

Модуль Dates пытается следовать простому принципу минимальных изменений при выполнении арифметических операций с Period. Этот подход также часто называют календарной арифметикой или тем, что вы, вероятно, предположили бы, если бы вас спросили о таком же расчёте в разговоре. В чём же суть? Рассмотрим классический пример: прибавьте 1 месяц к 31 января 2014 года. Какой будет ответ? Javascript ответит 3 марта (предполагает 31 день). PHP ответит 2 марта (предполагает 30 дней). Фактически, правильного ответа нет. В модуле Dates результат будет 28 февраля. Как это определяется? Представьте классическую игру в казино «7-7-7».

Теперь представьте, что вместо 7-7-7 на барабанах находятся значения Год-Месяц-День, или в нашем примере 2014-01-31. При добавлении 1 месяца к этой дате значение месяца увеличивается, теперь у нас 2014-02-31. Затем проверяется, больше ли число дня, чем последнее допустимое число дня в новом месяце; если это так (как в приведённом примере), число дня корректируется до последнего допустимого значения (28). Какие последствия имеет такой подход? Попробуйте добавить ещё один месяц к нашей дате, 2014-02-28 + Month(1) == 2014-03-28. Что? Вы ожидали последнее число марта? Нет, извините, помните барабаны 7-7-7. Меняется как можно меньше значений, поэтому мы сначала увеличиваем значение месяца на 1, 2014-03-28, и всё, мы закончили, так как это допустимая дата. С другой стороны, если мы добавим 2 месяца к исходной дате 2014-01-31, то получим 2014-03-31, как и ожидалось. Другим последствием этого подхода является потеря ассоциативности, когда определённый порядок действий принудителен (то есть, изменение порядка операций приводит к разным результатам). Например:

julia> (Date(2014,1,29)+Dates.Day(1)) + Dates.Month(1)
2014-02-28

julia> (Date(2014,1,29)+Dates.Month(1)) + Dates.Day(1)
2014-03-01

Что происходит? В первой строке мы добавляем 1 день к 29 января, что даёт 2014-01-30; затем мы добавляем 1 месяц, получив 2014-02-30, что затем корректируется до 2014-02-28. Во втором примере мы сначала добавляем 1 месяц, получив 2014-02-29, которое корректируется до 2014-02-28, а затем добавляем 1 день, что даёт 2014-03-01. Один из принципов проектирования в этом случае заключается в том, что при наличии нескольких периодов операции будут упорядочены по типам периодов, а не по их значениям или порядковому положению; это означает, что Year всегда будет добавляться первой, затем Month, затем Week и так далее. Таким образом, в следующем примере ассоциативность действительно сохраняется и всё работает как ожидается:

julia> Date(2014,1,29) + Dates.Day(1) + Dates.Month(1)
2014-03-01

julia> Date(2014,1,29) + Dates.Month(1) + Dates.Day(1)
2014-03-01

Сложно? Возможно. Что делать простому пользователю Dates? В итоге следует понимать, что явное принуждение к определённой ассоциативности при работе с месяцами может привести к некоторым неожиданным результатам, но в остальном всё должно работать как ожидается. К счастью, это в основном исчерпывает список необычных случаев в арифметике дат и периодов при работе со временем в UT (избегая «радостей» работы с переходом на летнее/зимнее время, високосных секунд и т. д.).

В качестве бонуса, все объекты арифметики периодов работают напрямую с диапазонами:

julia> dr = Date(2014,1,29):Day(1):Date(2014,2,3)
Date("2014-01-29"):Day(1):Date("2014-02-03")

julia> collect(dr)
6-element Vector{Date}:
 2014-01-29
 2014-01-30
 2014-01-31
 2014-02-01
 2014-02-02
 2014-02-03

julia> dr = Date(2014,1,29):Dates.Month(1):Date(2014,07,29)
Date("2014-01-29"):Month(1):Date("2014-07-29")

julia> collect(dr)
7-element Vector{Date}:
 2014-01-29
 2014-02-28
 2014-03-29
 2014-04-29
 2014-05-29
 2014-06-29
 2014-07-29

Функции коррекции

Хотя арифметика дат и периодов удобна, часто для вычислений с датами требуются календарные или временные особенности, а не фиксированное количество периодов. Праздники — идеальный пример; большинство из них следуют правилам, таким как «День памяти = последний понедельник мая» или «День благодарения = четвёртый четверг ноября». Эти виды временных выражений оперируют правилами, связанными с календарём, например, первым или последним числом месяца, следующим вторником или первым и третьим средами и т. д.

Модуль Dates предоставляет API коррекции через несколько удобных методов, которые помогают просто и кратко выражать временные правила. Первая группа методов коррекции относится к первому и последнему дню недели, месяца, квартала и года. Каждый из них принимает один TimeType в качестве входных данных и возвращает или корректирует до первого или последнего дня желаемого периода относительно входных данных.

julia> Dates.firstdayofweek(Date(2014,7,16)) # Adjusts the input to the Monday of the input's week
2014-07-14

julia> Dates.lastdayofmonth(Date(2014,7,16)) # Adjusts to the last day of the input's month
2014-07-31

julia> Dates.lastdayofquarter(Date(2014,7,16)) # Adjusts to the last day of the input's quarter
2014-09-30

Два следующих метода высшего порядка, tonext и toprev, обобщают работу с временными выражениями, принимая DateFunction в качестве первого аргумента вместе с начальным TimeType. DateFunction — это просто функция, обычно анонимная, которая принимает один TimeType в качестве входных данных и возвращает Bool, true указывающее, удовлетворяет ли критерий корректировки. Например:

julia> istuesday = x->Dates.dayofweek(x) == Dates.Tuesday; # Returns true if the day of the week of x is Tuesday

julia> Dates.tonext(istuesday, Date(2014,7,13)) # 2014-07-13 is a Sunday
2014-07-15

julia> Dates.tonext(Date(2014,7,13), Dates.Tuesday) # Convenience method provided for day of the week adjustments
2014-07-15

Это полезно для более сложных временных выражений с синтаксисом блока do:

julia> Dates.tonext(Date(2014,7,13)) do x
           # Return true on the 4th Thursday of November (Thanksgiving)
           Dates.dayofweek(x) == Dates.Thursday &&
           Dates.dayofweekofmonth(x) == 4 &&
           Dates.month(x) == Dates.November
       end
2014-11-27

Метод Base.filter может использоваться для получения всех допустимых дат/моментов в заданном диапазоне:

# Pittsburgh street cleaning; Every 2nd Tuesday from April to November
# Date range from January 1st, 2014 to January 1st, 2015
julia> dr = Dates.Date(2014):Day(1):Dates.Date(2015);

julia> filter(dr) do x
           Dates.dayofweek(x) == Dates.Tue &&
           Dates.April <= Dates.month(x) <= Dates.Nov &&
           Dates.dayofweekofmonth(x) == 2
       end
8-element Vector{Date}:
 2014-04-08
 2014-05-13
 2014-06-10
 2014-07-08
 2014-08-12
 2014-09-09
 2014-10-14
 2014-11-11

Дополнительные примеры и тесты доступны в stdlib/Dates/test/adjusters.jl.

Типы периодов

Периоды — это человеческое представление о дискретных, иногда нерегулярных промежутках времени. Рассмотрим 1 месяц; он может представлять, в днях, значение 28, 29, 30 или 31 в зависимости от года и месяца. Или год может представлять 365 или 366 дней в случае високосного года. Типы Period — это простые обёртки Int64 и создаются путём обёртывания любого типа, преобразуемого к Int64, то есть Year(1) или Month(3.0). Арифметика между Period одного типа ведёт себя как целые числа, и доступна ограниченная арифметика Period-Real. Вы можете извлечь базовое целое число с помощью Dates.value.

julia> y1 = Dates.Year(1)
1 year

julia> y2 = Dates.Year(2)
2 years

julia> y3 = Dates.Year(10)
10 years

julia> y1 + y2
3 years

julia> div(y3,y2)
5

julia> y3 - y2
8 years

julia> y3 % y2
0 years

julia> div(y3,3) # mirrors integer division
3 years

julia> Dates.value(Dates.Millisecond(10))
10

Округление

Date и DateTime могут быть округлены до заданной точности (например, 1 месяц или 15 минут) с помощью floor, ceil или round:

julia> floor(Date(1985, 8, 16), Dates.Month)
1985-08-01

julia> ceil(DateTime(2013, 2, 13, 0, 31, 20), Dates.Minute(15))
2013-02-13T00:45:00

julia> round(DateTime(2016, 8, 6, 20, 15), Dates.Day)
2016-08-07T00:00:00

В отличие от числового метода round, который по умолчанию разрывает ничьи в сторону чётного числа, метод TimeTyperound использует режим округления RoundNearestTiesUp. (Сложно представить, что означало бы разбиение ничьих к ближайшему «чётному» TimeType). Более подробные сведения о доступных режимах округления можно найти в справочнике по API.

Округление в целом должно работать как ожидается, но есть несколько случаев, в которых ожидаемое поведение не очевидно.

Эпоха округления

Во многих случаях точность, указанная для округления (например, Dates.Second(30)), делится без остатка на следующий больший период (в данном случае, Dates.Minute(1)). Однако поведение округления в случаях, когда это не так, может привести к путанице. Какой ожидаемый результат округления DateTime до ближайших 10 часов?

julia> round(DateTime(2016, 7, 17, 11, 55), Dates.Hour(10))
2016-07-17T12:00:00

Это может показаться запутанным, учитывая, что час (12) не делится на 10 без остатка. Причина, по которой выбран 2016-07-17T12:00:00, заключается в том, что это 17 676 660 часов после 0000-01-01T00:00:00, а 17 676 660 делится на 10.

Поскольку значения Julia Date и DateTime представлены в соответствии со стандартом ISO 8601, 0000-01-01T00:00:00 был выбран в качестве основы (или «эпохи округления») для начала подсчёта дней (и миллисекунд) при вычислениях округления. (Обратите внимание, что это несколько отличается от внутреннего представления Julia значений Date с использованием обозначения Rata Die; но поскольку стандарт ISO 8601 наиболее виден конечному пользователю, 0000-01-01T00:00:00 был выбран в качестве эпохи округления вместо 0000-12-31T00:00:00, используемого внутри, чтобы минимизировать путаницу.)

Единственным исключением из использования 0000-01-01T00:00:00 в качестве эпохи округления является округление до недель. Округление до ближайшей недели всегда вернёт понедельник (первый день недели, как определено стандартом ISO 8601). По этой причине мы используем 0000-01-03T00:00:00 (первый день первой недели года 0000, как определено стандартом ISO 8601) в качестве основы при округлении до числа недель.

Вот ещё один случай, в котором ожидаемое поведение не обязательно очевидно: что происходит при округлении до ближайшего P(2), где P — тип Period? В некоторых случаях (в частности, когда P <: Dates.TimePeriod) ответ очевиден:

julia> round(DateTime(2016, 7, 17, 8, 55, 30), Dates.Hour(2))
2016-07-17T08:00:00

julia> round(DateTime(2016, 7, 17, 8, 55, 30), Dates.Minute(2))
2016-07-17T08:56:00

Это кажется очевидным, потому что две единицы каждого из этих периодов по-прежнему делятся без остатка на следующий больший период. Но в случае двух месяцев (которые по-прежнему делятся без остатка на один год) ответ может быть неожиданным:

julia> round(DateTime(2016, 7, 17, 8, 55, 30), Dates.Month(2))
2016-07-01T00:00:00

Почему округляется до первого числа июля, даже если это месяц 7 (нечётное число)? Ключ в том, что месяцы нумеруются с 1 (первый месяц — 1), в отличие от часов, минут, секунд и миллисекунд (первые из которых нумеруются с 0).

Это означает, что округление DateTime до чётного числа секунд, минут, часов или лет (потому что спецификация ISO 8601 включает ноль года) приведёт к DateTime с чётным значением в этом поле, в то время как округление DateTime до чётного числа месяцев приведёт к значению месяца, имеющему нечётное значение. Так как и месяцы, и годы могут содержать нечётное число дней, то чётно ли значение в поле дней при округлении до чётного числа дней — неопределённо.

Дополнительную информацию о методах, экспортируемых из модуля Dates , см. в справочнике по API.

Справочник по API

Типы дат и времени

Dates.PeriodТип

Period
Year
Quarter
Month
Week
Day
Hour
Minute
Second
Millisecond
Microsecond
Nanosecond

Period типы представляют собой дискретные, человекочитаемые представления времени.

исходный код

Dates.CompoundPeriodТип

CompoundPeriod

Период CompoundPeriod полезен для выражения временных промежутков, которые не являются фиксированным кратным меньшим периодам. Например, «год и один день» — это не фиксированное количество дней, но может быть выражено с помощью CompoundPeriod. Фактически, CompoundPeriod автоматически генерируется при сложении различных типов периодов, например, Year(1) + Day(1) даёт CompoundPeriod результат.

исходный код

Dates.InstantТип

Instant

Instant типы представляют целочисленные, машинные представления времени как непрерывные временные шкалы, начинающиеся с эпохи.

исходный код

Dates.UTInstantТип

UTInstant{T}

UTInstant представляет машинную временную шкалу, основанную на времени UT (1 день = одно вращение Земли). T — это Period параметр, который указывает на разрешение или точность момента.

исходный код

Dates.TimeTypeТип

TimeType

TimeType типы оборачивают Instant машинные экземпляры, чтобы предоставить человекочитаемые представления машинного момента. Time, DateTime и Date являются подтипами TimeType.

исходный код

Dates.DateTimeТип

DateTime

DateTime оборачивает UTInstant{Millisecond} и интерпретирует его согласно пролептическому григорианскому календарю.

исходный код

Dates.DateТип

Date

Date оборачивает UTInstant{Day} и интерпретирует его согласно пролептическому григорианскому календарю.

исходный код

Dates.TimeТип

Time

Time оборачивает Nanosecond и представляет собой определённый момент в 24-часовом дне.

исходный код

Dates.TimeZoneТип

TimeZone

Географическая зона, обычно основанная на долготе, определяющая время в определённом месте. Некоторые часовые пояса соблюдают летнее время (например, EST —> EDT). Для реализации и дополнительной поддержки см. пакет TimeZones.jl

исходный код

Dates.UTCТип

UTC

UTC, или Координированное универсальное время, является TimeZone, от которого измеряются все остальные. Оно связано со временем на 0° долготы. Оно не корректируется на летнее время.

исходный код

Функции модуля Dates

Dates.DateTimeМетод

DateTime(y, [m, d, h, mi, s, ms]) -> DateTime

Создать тип DateTime по частям. Аргументы должны быть преобразуемы в Int64.

исходный код

Dates.DateTimeМетод

DateTime(periods::Period...) -> DateTime

Создать тип DateTime по частям типа Period. Аргументы могут быть в любом порядке. Части DateTime, которые не указаны, будут по умолчанию иметь значение Dates.default(period).

исходный код

Dates.DateTimeМетод

DateTime(f::Function, y[, m, d, h, mi, s]; step=Day(1), limit=10000) -> DateTime

Создать DateTime с помощью API корректировки. Точка отсчёта будет построена из предоставленных аргументов y, m, d..., и будет корректироваться до тех пор, пока f::Function не вернёт true. Размер шага при корректировке можно указать вручную через ключевое слово step . limit задаёт предел максимального числа итераций, которые API корректировки будут продолжать выполнять, прежде чем выбросить ошибку (в случае, если f::Function никогда не будет удовлетворено).

Примеры

julia> DateTime(dt -> Dates.second(dt) == 40, 2010, 10, 20, 10; step = Dates.Second(1))
2010-10-20T10:00:40

julia> DateTime(dt -> Dates.hour(dt) == 20, 2010, 10, 20, 10; step = Dates.Hour(1), limit = 5)
ERROR: ArgumentError: Adjustment limit reached: 5 iterations
Stacktrace:
[...]
исходный код

Dates.DateTimeМетод

DateTime(dt::Date) -> DateTime

Преобразовать Date в DateTime. Части часа, минуты, секунды и миллисекунды нового DateTime предполагаются равными нулю.

исходный код

Dates.DateTimeМетод

DateTime(dt::AbstractString, format::AbstractString; locale="english") -> DateTime

Создать DateTime, разобрав строку даты и времени dt по шаблону, заданному в строке format (см. DateFormat для синтаксиса).

Этот метод создаёт объект DateFormat каждый раз при вызове. Рекомендуется создать объект DateFormat и использовать его в качестве второго аргумента, чтобы избежать потери производительности при многократном использовании одного и того же формата.

Пример

julia> DateTime("2020-01-01", "yyyy-mm-dd")
2020-01-01T00:00:00

julia> a = ("2020-01-01", "2020-01-02");

julia> [DateTime(d, dateformat"yyyy-mm-dd") for d ∈ a] # preferred
2-element Vector{DateTime}:
 2020-01-01T00:00:00
 2020-01-02T00:00:00
исходный код

Dates.formatМетод

format(dt::TimeType, format::AbstractString; locale="english") -> AbstractString

Создайте строку, используя объект TimeType и применяя предоставленный format. Для построения строки format можно использовать следующие коды символов:

Код Примеры Комментарий
y 6 Числовой год с фиксированной шириной
Y 1996 Числовой год с минимальной шириной
m 1, 12 Числовой месяц с минимальной шириной
u Янв Сокращенное название месяца до 3 символов в соответствии с locale
U Январь Полное название месяца в соответствии с ключевым словом locale
d 1, 31 День месяца с минимальной шириной
H 0, 23 Час (24-часовой формат) с минимальной шириной
M 0, 59 Минута с минимальной шириной
S 0, 59 Секунда с минимальной шириной
s 000, 500 Миллисекунда с минимальной шириной 3
e Пн, Вт Сокращенные дни недели
E Понедельник Полное название дня недели

Количество последовательных символов кода указывает ширину кода. Формат yyyy-mm указывает, что код y должен иметь ширину четыре, а m — ширину два. Коды, которые дают числовые цифры, имеют связанный режим: фиксированной ширины или минимальной ширины. Режим фиксированной ширины дополняет значение слева нулями, когда оно короче заданной ширины, и обрезает значение, когда оно длиннее. Режим минимальной ширины работает так же, как режим фиксированной ширины, за исключением того, что он не обрезает значения, которые длиннее ширины.

При создании format вы можете использовать любые символы, не являющиеся кодами, в качестве разделителей. Например, для создания строки "1996-01-15T00:00:00" можно использовать format: "гггг-мм-ддЧЧ:ММ:СС". Обратите внимание, что если вам нужно использовать символ кода как буквальный символ, вы можете использовать символ экранирования обратный слэш. Строка "1996y01m" может быть создана с форматом "гггг\мм\м".

источник

Dates.DateFormatТип

DateFormat(format::AbstractString, locale="english") -> DateFormat

Создайте объект форматирования даты, который можно использовать для анализа строк дат или форматирования объекта даты в виде строки. Для построения строки format можно использовать следующие коды символов:

Код Совпадения Комментарий
y 1996, 96 Возвращает год 1996, 0096
Y 1996, 96 Возвращает год 1996, 0096. Эквивалентно y
m 1, 01 Совпадение с месяцами из 1 или 2 цифр
u Янв Совпадение с сокращенными названиями месяцев в соответствии с ключевым словом locale
U Январь Совпадение с полными названиями месяцев в соответствии с ключевым словом locale
d 1, 01 Совпадение с днями из 1 или 2 цифр
H 00 Совпадение с часами (24-часовой формат)
I 00 Для вывода часов в 12-часовом формате
M 00 Совпадение с минутами
S 00 Совпадение с секундами
s .500 Совпадение с миллисекундами
e Пн, Вт Совпадение с сокращенными днями недели
E Понедельник Совпадение с полными названиями дней недели
p ДОП Совпадение с AM/PM (регистронезависимо)
yyyymmdd 19960101 Совпадение с годом, месяцем и днем фиксированной ширины

Символы, не указанные выше, обычно обрабатываются как разделители между частями даты и времени. Например, строка dt "1996-01-15T00:00:00.0" будет иметь строку format "y-m-dTH:M:S.s". Если вам нужно использовать символ кода в качестве разделителя, вы можете экранировать его с помощью обратного слэша. Дата "1995y01m" будет иметь формат "y\ym\m".

Обратите внимание, что 12:00 AM соответствует 00:00 (полночь), а 12:00 PM соответствует 12:00 (день). При анализе времени со спецификатором p, любой час (либо H или I) интерпретируется как 12-часовой формат, поэтому код I в основном полезен для вывода.

Создание объекта DateFormat дорогостоящее. По возможности создавайте его один раз и используйте многократно или попробуйте макрос строки dateformat"". Использование этого макроса создаёт объект DateFormat один раз во время макрорасширения и повторно использует его позже. Также существуют несколько предопределенных форматировщиков, перечисленных позже.

См. DateTime и format для того, как использовать объект DateFormat для анализа и записи строк дат соответственно.

источник

Dates.@dateformat_strМакрос

dateformat"Y-m-d H:M:S"

Создайте объект DateFormat. Аналогично DateFormat("Y-m-d H:M:S"), но создает объект DateFormat один раз во время макрорасширения.

См. DateFormat для подробностей о спецификаторах формата.

источник

Dates.DateTimeМетод

DateTime(dt::AbstractString, df::DateFormat=ISODateTimeFormat) -> DateTime

Создайте объект DateTime, проанализировав строку даты и времени dt в соответствии с шаблоном, заданным объектом DateFormat, или dateformat"гггг-мм-ддЧЧ:ММ:СС.с", если он опущен.

Аналогично DateTime(::AbstractString, ::AbstractString), но более эффективно при многократном анализе аналогично отформатированных строк даты и времени с предварительно созданным объектом DateFormat.

источник

Dates.DateМетод

Date(y, [m, d]) -> Date

Создайте тип Date, используя части. Аргументы должны быть преобразуемы в Int64.

источник

Dates.DateМетод

Date(period::Period...) -> Date

Создайте тип Date по частям типа Period. Аргументы могут быть в любом порядке. Части Date которые не указаны, будут по умолчанию иметь значение Dates.default(period).

источник

Dates.DateМетод

Date(f::Function, y[, m, d]; step=Day(1), limit=10000) -> Date

Создайте Date с помощью API корректировки. Начальная точка будет построена из предоставленных y, m, d аргументов и будет скорректирована до тех пор, пока f::Function не вернёт true. Размер шага при корректировке можно указать вручную с помощью ключевого слова step. limit устанавливает ограничение на максимальное количество итераций, которые API корректировки будет пытаться выполнить до выдачи ошибки (при условии, что f::Function никогда не будет удовлетворено).

Примеры

julia> Date(date -> Dates.week(date) == 20, 2010, 01, 01)
2010-05-17

julia> Date(date -> Dates.year(date) == 2010, 2000, 01, 01)
2010-01-01

julia> Date(date -> Dates.month(date) == 10, 2000, 01, 01; limit = 5)
ERROR: ArgumentError: Adjustment limit reached: 5 iterations
Stacktrace:
[...]
исходный код

Dates.DateМетод

Date(dt::DateTime) -> Date

Преобразовать DateTime в Date. Часы, минуты, секунды и миллисекунды DateTime отбрасываются, поэтому для построения используются только год, месяц и день.

исходный код

Dates.DateМетод

Date(d::AbstractString, format::AbstractString; locale="english") -> Date

Построить Date, разобрав строку даты d по шаблону, заданному в строке format (см. DateFormat для синтаксиса).

Этот метод создает объект DateFormat каждый раз при вызове. Рекомендуется создать объект DateFormat и использовать его в качестве второго аргумента, чтобы избежать потерь производительности при многократном использовании одного и того же формата.

Пример

julia> Date("2020-01-01", "yyyy-mm-dd")
2020-01-01

julia> a = ("2020-01-01", "2020-01-02");

julia> [Date(d, dateformat"yyyy-mm-dd") for d ∈ a] # preferred
2-element Vector{Date}:
 2020-01-01
 2020-01-02
исходный код

Dates.DateМетод

Date(d::AbstractString, df::DateFormat=ISODateFormat) -> Date

Построить Date, разобрав строку даты d по шаблону, заданному в объекте DateFormat, или по умолчанию "yyyy-mm-dd".

Аналогично Date(::AbstractString, ::AbstractString), но более эффективно при многократном разборе строк даты с одинаковым форматом с предварительно созданным объектом DateFormat.

исходный код

Dates.TimeМетод

Time(h, [mi, s, ms, us, ns]) -> Time

Построить тип Time по частям. Аргументы должны быть преобразуемы в Int64.

исходный код

Dates.TimeМетод

Time(period::TimePeriod...) -> Time

Построить тип Time по частям типа Period. Аргументы могут быть в любом порядке. Не указанные Time части по умолчанию принимают значение Dates.default(period).

исходный код

Dates.TimeМетод

Time(f::Function, h, mi=0; step::Period=Second(1), limit::Int=10000)
Time(f::Function, h, mi, s; step::Period=Millisecond(1), limit::Int=10000)
Time(f::Function, h, mi, s, ms; step::Period=Microsecond(1), limit::Int=10000)
Time(f::Function, h, mi, s, ms, us; step::Period=Nanosecond(1), limit::Int=10000)

Создать Time с помощью API корректировки. Начальная точка будет построена из предоставленных h, mi, s, ms, us аргументов и будет скорректирована до тех пор, пока f::Function не вернёт true. Размер шага при корректировке можно указать вручную с помощью ключевого слова step. limit ограничивает максимальное количество итераций, которые API корректировки будет пытаться выполнить до выдачи ошибки (в случае, если f::Function никогда не будет удовлетворено). Обратите внимание, что по умолчанию шаг корректировки будет настроен на обеспечение большей точности для заданных аргументов; т.е. если указаны аргументы часов, минут и секунд, шаг по умолчанию будет Millisecond(1), а не Second(1).

Примеры

julia> Dates.Time(t -> Dates.minute(t) == 30, 20)
20:30:00

julia> Dates.Time(t -> Dates.minute(t) == 0, 20)
20:00:00

julia> Dates.Time(t -> Dates.hour(t) == 10, 3; limit = 5)
ERROR: ArgumentError: Adjustment limit reached: 5 iterations
Stacktrace:
[...]
исходный код

Dates.TimeМетод

Time(dt::DateTime) -> Time

Преобразовать DateTime в Time. Часы, минуты, секунды и миллисекунды DateTime используются для создания нового Time. Микросекунды и наносекунды по умолчанию равны нулю.

исходный код

Dates.TimeМетод

Time(t::AbstractString, format::AbstractString; locale="english") -> Time

Построить Time, разобрав строку времени t по шаблону, заданному в строке format (см. DateFormat для синтаксиса).

Этот метод создает объект DateFormat каждый раз при вызове. Рекомендуется создать объект DateFormat и использовать его в качестве второго аргумента, чтобы избежать потерь производительности при многократном использовании одного и того же формата.

Пример

julia> Time("12:34pm", "HH:MMp")
12:34:00

julia> a = ("12:34pm", "2:34am");

julia> [Time(d, dateformat"HH:MMp") for d ∈ a] # preferred
2-element Vector{Time}:
 12:34:00
 02:34:00
исходный код

Dates.TimeМетод

Time(t::AbstractString, df::DateFormat=ISOTimeFormat) -> Time

Построить Time, разобрав строку даты и времени t по шаблону, заданному в объекте DateFormat, или по умолчанию "HH:MM:SS.s".

Аналогично Time(::AbstractString, ::AbstractString), но более эффективно при многократном разборе строк времени с одинаковым форматом с предварительно созданным объектом DateFormat.

исходный код

Dates.nowМетод

now() -> DateTime

Возвращает DateTime, соответствующий системному времени пользователя, включая локаль системной временной зоны.

исходный код

Dates.nowМетод

now(::Type{UTC}) -> DateTime

Возвращает DateTime, соответствующий системному времени пользователя в формате UTC/GMT.

исходный код

Base.epsМетод

eps(::Type{DateTime}) -> Millisecond
eps(::Type{Date}) -> Day
eps(::Type{Time}) -> Nanosecond
eps(::TimeType) -> Period

Возвращает наименьшее значение единицы, поддерживаемое TimeType.

Примеры

julia> eps(DateTime)
1 millisecond

julia> eps(Date)
1 day

julia> eps(Time)
1 nanosecond
исходный код

Функции-аксессоры

Dates.yearФункция

year(dt::TimeType) -> Int64

Год Date или DateTime как Int64.

исходный код

Dates.monthФункция

month(dt::TimeType) -> Int64

Месяц Date или DateTime как Int64.

исходный код

Dates.weekФункция

week(dt::TimeType) -> Int64

Возвращает номер недели ISO даты Date или DateTime как Int64. Обратите внимание, что первой неделей года является неделя, содержащая первый четверг года, что может привести к тому, что даты до 4 января будут относиться к последней неделе предыдущего года. Например, week(Date(2005, 1, 1)) — 53-я неделя 2004 года.

Примеры

julia> Dates.week(Date(1989, 6, 22))
25

julia> Dates.week(Date(2005, 1, 1))
53

julia> Dates.week(Date(2004, 12, 31))
53
исходный код

Dates.dayФункция

day(dt::TimeType) -> Int64

День месяца Date или DateTime как Int64.

исходный код

Dates.hourФункция

hour(dt::DateTime) -> Int64

Час дня DateTime в виде Int64.

исходный код
hour(t::Time) -> Int64

Час Time в виде Int64.

исходный код

Dates.minuteФункция

minute(dt::DateTime) -> Int64

Минута DateTime в виде Int64.

исходный код
minute(t::Time) -> Int64

Минута Time в виде Int64.

исходный код

Dates.secondФункция

second(dt::DateTime) -> Int64

Секунда DateTime в виде Int64.

исходный код
second(t::Time) -> Int64

Секунда Time в виде Int64.

исходный код

Dates.millisecondФункция

millisecond(dt::DateTime) -> Int64

Миллисекунда DateTime в виде Int64.

исходный код
millisecond(t::Time) -> Int64

Миллисекунда Time в виде Int64.

исходный код

Dates.microsecondФункция

microsecond(t::Time) -> Int64

Микросекунда Time в виде Int64.

исходный код

Dates.nanosecondФункция

nanosecond(t::Time) -> Int64

Наносекунда Time в виде Int64.

исходный код

Dates.YearМетод

Year(v)

Создаёт объект Year с заданным значением v. Входное значение должно быть без потерь преобразуемо в Int64.

исходный код

Dates.MonthМетод

Month(v)

Создаёт объект Month с заданным значением v. Входное значение должно быть без потерь преобразуемо в Int64.

исходный код

Dates.WeekМетод

Week(v)

Создаёт объект Week с заданным значением v. Входное значение должно быть без потерь преобразуемо в Int64.

исходный код

Dates.DayМетод

Day(v)

Создаёт объект Day с заданным значением v. Входное значение должно быть без потерь преобразуемо в Int64.

исходный код

Dates.HourМетод

Hour(dt::DateTime) -> Hour

Часовая часть DateTime в виде Hour.

исходный код

Dates.MinuteМетод

Minute(dt::DateTime) -> Minute

Минутная часть DateTime в виде Minute.

исходный код

Dates.SecondМетод

Second(dt::DateTime) -> Second

Секундная часть DateTime в виде Second.

исходный код

Dates.MillisecondМетод

Millisecond(dt::DateTime) -> Millisecond

Миллисекундная часть DateTime в виде Millisecond.

исходный код

Dates.MicrosecondМетод

Microsecond(dt::Time) -> Microsecond

Микросекундная часть Time в виде Microsecond.

исходный код

Dates.NanosecondМетод

Nanosecond(dt::Time) -> Nanosecond

Наносекундная часть Time в виде Nanosecond.

исходный код

Dates.yearmonthФункция

yearmonth(dt::TimeType) -> (Int64, Int64)

Одновременно возвращает год и месяц Date или DateTime.

исходный код

Dates.monthdayФункция

monthday(dt::TimeType) -> (Int64, Int64)

Одновременно возвращает месяц и день Date или DateTime.

исходный код

Dates.yearmonthdayФункция

yearmonthday(dt::TimeType) -> (Int64, Int64, Int64)

Одновременно возвращает год, месяц и день Date или DateTime.

исходный код

Функции запроса

Dates.daynameФункция

dayname(dt::TimeType; locale="english") -> String
dayname(day::Integer; locale="english") -> String

Возвращает полное название дня недели для Date или DateTime в заданном locale. Также принимает Integer.

Примеры

julia> Dates.dayname(Date("2000-01-01"))
"Saturday"

julia> Dates.dayname(4)
"Thursday"
исходный код

Dates.dayabbrФункция

dayabbr(dt::TimeType; locale="english") -> String
dayabbr(day::Integer; locale="english") -> String

Возвращает сокращённое название дня недели для Date или DateTime в заданном locale. Также принимает Integer.

Примеры

julia> Dates.dayabbr(Date("2000-01-01"))
"Sat"

julia> Dates.dayabbr(3)
"Wed"
исходный код

Dates.dayofweekФункция

dayofweek(dt::TimeType) -> Int64

Возвращает день недели в виде Int64 с 1 = Monday, 2 = Tuesday, etc..

Примеры

julia> Dates.dayofweek(Date("2000-01-01"))
6
исходный код

Dates.dayofmonthФункция

dayofmonth(dt::TimeType) -> Int64

День месяца Date или DateTime в виде Int64.

исходный код

Dates.dayofweekofmonthФункция

dayofweekofmonth(dt::TimeType) -> Int

Для дня недели dt, возвращает его порядковый номер в месяце dt. Если день недели dt — понедельник, то 1 = First Monday of the month, 2 = Second Monday of the month, etc. В диапазоне от 1 до 5.

Примеры

julia> Dates.dayofweekofmonth(Date("2000-02-01"))
1

julia> Dates.dayofweekofmonth(Date("2000-02-08"))
2

julia> Dates.dayofweekofmonth(Date("2000-02-15"))
3
исходный код

Dates.daysofweekinmonthФункция

daysofweekinmonth(dt::TimeType) -> Int

Для дня недели dt, возвращает общее количество таких дней недели в месяце dt. Возвращает 4 или 5. Полезно в временных выражениях для указания последнего дня недели в месяце, включая dayofweekofmonth(dt) == daysofweekinmonth(dt) в функцию корректировки.

Примеры

julia> Dates.daysofweekinmonth(Date("2005-01-01"))
5

julia> Dates.daysofweekinmonth(Date("2005-01-04"))
4
исходный код

Dates.monthnameФункция

monthname(dt::TimeType; locale="english") -> String
monthname(month::Integer, locale="english") -> String

Возвращает полное имя месяца Date или DateTime или Integer в заданном locale.

Примеры

julia> Dates.monthname(Date("2005-01-04"))
"January"

julia> Dates.monthname(2)
"February"
исходный код

Dates.monthabbrФункция

monthabbr(dt::TimeType; locale="english") -> String
monthabbr(month::Integer, locale="english") -> String

Возвращает сокращенное имя месяца Date или DateTime или Integer в заданном locale.

Примеры

julia> Dates.monthabbr(Date("2005-01-04"))
"Jan"

julia> monthabbr(2)
"Feb"
исходный код

Dates.daysinmonthФункция

daysinmonth(dt::TimeType) -> Int

Возвращает количество дней в месяце dt. Значение будет 28, 29, 30 или 31.

Примеры

julia> Dates.daysinmonth(Date("2000-01"))
31

julia> Dates.daysinmonth(Date("2001-02"))
28

julia> Dates.daysinmonth(Date("2000-02"))
29
исходный код

Dates.isleapyearФункция

isleapyear(dt::TimeType) -> Bool

Возвращает true, если год dt високосный.

Примеры

julia> Dates.isleapyear(Date("2004"))
true

julia> Dates.isleapyear(Date("2005"))
false
исходный код

Dates.dayofyearФункция

dayofyear(dt::TimeType) -> Int

Возвращает день года для dt, где 1 января — день 1.

исходный код

Dates.daysinyearФункция

daysinyear(dt::TimeType) -> Int

Возвращает 366, если год dt високосный, иначе 365.

Примеры

julia> Dates.daysinyear(1999)
365

julia> Dates.daysinyear(2000)
366
исходный код

Dates.quarterofyearФункция

quarterofyear(dt::TimeType) -> Int

Возвращает квартал, в котором находится dt. Диапазон значений от 1 до 4.

исходный код

Dates.dayofquarterФункция

dayofquarter(dt::TimeType) -> Int

Возвращает день текущего квартала dt. Диапазон значений от 1 до 92.

исходный код

Функции корректировки

Base.truncМетод

trunc(dt::TimeType, ::Type{Period}) -> TimeType

Округляет значение dt в соответствии с предоставленным типом Period.

Примеры

julia> trunc(Dates.DateTime("1996-01-01T12:30:00"), Dates.Day)
1996-01-01T00:00:00
исходный код

Dates.firstdayofweekФункция

firstdayofweek(dt::TimeType) -> TimeType

Корректирует dt до понедельника своей недели.

Примеры

julia> Dates.firstdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-01T00:00:00
исходный код

Dates.lastdayofweekФункция

lastdayofweek(dt::TimeType) -> TimeType

Корректирует dt до воскресенья своей недели.

Примеры

julia> Dates.lastdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-07T00:00:00
исходный код

Dates.firstdayofmonthФункция

firstdayofmonth(dt::TimeType) -> TimeType

Корректирует dt до первого дня своего месяца.

Примеры

julia> Dates.firstdayofmonth(DateTime("1996-05-20"))
1996-05-01T00:00:00
исходный код

Dates.lastdayofmonthФункция

lastdayofmonth(dt::TimeType) -> TimeType

Корректирует dt до последнего дня своего месяца.

Примеры

julia> Dates.lastdayofmonth(DateTime("1996-05-20"))
1996-05-31T00:00:00
исходный код

Dates.firstdayofyearФункция

firstdayofyear(dt::TimeType) -> TimeType

Корректирует dt до первого дня своего года.

Примеры

julia> Dates.firstdayofyear(DateTime("1996-05-20"))
1996-01-01T00:00:00
исходный код

Dates.lastdayofyearФункция

lastdayofyear(dt::TimeType) -> TimeType

Корректирует dt до последнего дня своего года.

Примеры

julia> Dates.lastdayofyear(DateTime("1996-05-20"))
1996-12-31T00:00:00
исходный код

Dates.firstdayofquarterФункция

firstdayofquarter(dt::TimeType) -> TimeType

Корректирует dt до первого дня своего квартала.

Примеры

julia> Dates.firstdayofquarter(DateTime("1996-05-20"))
1996-04-01T00:00:00

julia> Dates.firstdayofquarter(DateTime("1996-08-20"))
1996-07-01T00:00:00
исходный код

Dates.lastdayofquarterФункция

lastdayofquarter(dt::TimeType) -> TimeType

Корректирует dt до последнего дня своего квартала.

Примеры

julia> Dates.lastdayofquarter(DateTime("1996-05-20"))
1996-06-30T00:00:00

julia> Dates.lastdayofquarter(DateTime("1996-08-20"))
1996-09-30T00:00:00
исходный код

Dates.tonextМетод

tonext(dt::TimeType, dow::Int; same::Bool=false) -> TimeType

Корректирует dt до следующего дня недели, соответствующего dow с 1 = Monday, 2 = Tuesday, etc. Установка same=true позволяет рассматривать текущий dt как следующий dow, что приводит к отсутствию корректировки.

исходный код

Dates.toprevМетод

toprev(dt::TimeType, dow::Int; same::Bool=false) -> TimeType

Корректирует dt до предыдущего дня недели, соответствующего dow с 1 = Monday, 2 = Tuesday, etc. Установка same=true позволяет рассматривать текущий dt как предыдущий dow, что приводит к отсутствию корректировки.

исходный код
END_OF_DOCUMENT_MARKER

Dates.tofirstФункция

tofirst(dt::TimeType, dow::Int; of=Month) -> TimeType

Настраивает dt на первое dow месяца. В качестве альтернативы, of=Year будет настроено на первое dow года.

исходный код

Dates.tolastФункция

tolast(dt::TimeType, dow::Int; of=Month) -> TimeType

Настраивает dt на последнее dow месяца. В качестве альтернативы, of=Year будет настроено на последнее dow года.

исходный код

Dates.tonextМетод

tonext(func::Function, dt::TimeType; step=Day(1), limit=10000, same=false) -> TimeType

Настраивает dt путем итерации не более чем limit итераций с шагом step до тех пор, пока func не вернёт true. func должен принимать один TimeType аргумент и возвращать Bool. same позволяет dt быть рассмотренным при удовлетворении func.

исходный код

Dates.toprevМетод

toprev(func::Function, dt::TimeType; step=Day(-1), limit=10000, same=false) -> TimeType

Настраивает dt путем итерации не более чем limit итераций с шагом step до тех пор, пока func не вернёт true. func должен принимать один TimeType аргумент и возвращать Bool. same позволяет dt быть рассмотренным при удовлетворении func.

исходный код

Периоды

Dates.PeriodМетод

Year(v)
Quarter(v)
Month(v)
Week(v)
Day(v)
Hour(v)
Minute(v)
Second(v)
Millisecond(v)
Microsecond(v)
Nanosecond(v)

Создаёт тип Period со значением v. Входное значение должно быть без потерь преобразуемо в Int64.

исходный код

Dates.CompoundPeriodМетод

CompoundPeriod(periods) -> CompoundPeriod

Создаёт CompoundPeriod из Vector Period. Все Period одного типа будут сложены вместе.

Примеры

julia> Dates.CompoundPeriod(Dates.Hour(12), Dates.Hour(13))
25 hours

julia> Dates.CompoundPeriod(Dates.Hour(-1), Dates.Minute(1))
-1 hour, 1 minute

julia> Dates.CompoundPeriod(Dates.Month(1), Dates.Week(-2))
1 month, -2 weeks

julia> Dates.CompoundPeriod(Dates.Minute(50000))
50000 minutes
исходный код

Dates.valueФункция

Dates.value(x::Period) -> Int64

Для заданного периода возвращает соответствующее значение. Например, value(Millisecond(10)) возвращает 10 как целое число.

исходный код

Dates.defaultФункция

default(p::Period) -> Period

Возвращает разумное значение по умолчанию для входящего периода, возвращая T(1) для Года, Месяца и Дня, и T(0) для Часа, Минуты, Секунды и Миллисекунды.

исходный код

Dates.periodsФункция

Dates.periods(::CompoundPeriod) -> Vector{Period}

Возвращает Vector Period составляющих данный CompoundPeriod.

Эта функция требует Julia 1.7 или более поздней версии.

исходный код

Функции округления

Значения Date и DateTime можно округлить до заданного разрешения (например, 1 месяц или 15 минут) с помощью floor, ceil, или round.

Base.floorМетод

floor(dt::TimeType, p::Period) -> TimeType

Возвращает ближайшее Date или DateTime меньшее или равное dt с разрешением p.

Для удобства, p может быть типом вместо значения: floor(dt, Dates.Hour) является сокращением для floor(dt, Dates.Hour(1)).

julia> floor(Date(1985, 8, 16), Dates.Month)
1985-08-01

julia> floor(DateTime(2013, 2, 13, 0, 31, 20), Dates.Minute(15))
2013-02-13T00:30:00

julia> floor(DateTime(2016, 8, 6, 12, 0, 0), Dates.Day)
2016-08-06T00:00:00
исходный код

Base.ceilМетод

ceil(dt::TimeType, p::Period) -> TimeType

Возвращает ближайшее Date или DateTime большее или равное dt с разрешением p.

Для удобства, p может быть типом вместо значения: ceil(dt, Dates.Hour) является сокращением для ceil(dt, Dates.Hour(1)).

julia> ceil(Date(1985, 8, 16), Dates.Month)
1985-09-01

julia> ceil(DateTime(2013, 2, 13, 0, 31, 20), Dates.Minute(15))
2013-02-13T00:45:00

julia> ceil(DateTime(2016, 8, 6, 12, 0, 0), Dates.Day)
2016-08-07T00:00:00
исходный код

Base.roundМетод

round(dt::TimeType, p::Period, [r::RoundingMode]) -> TimeType

Возвращает ближайшее Date или DateTime к dt с разрешением p. По умолчанию (RoundNearestTiesUp), при равенстве (например, округление 9:30 до ближайшего часа) выполняется округление вверх.

Для удобства, p может быть типом вместо значения: round(dt, Dates.Hour) является сокращением для round(dt, Dates.Hour(1)).

julia> round(Date(1985, 8, 16), Dates.Month)
1985-08-01

julia> round(DateTime(2013, 2, 13, 0, 31, 20), Dates.Minute(15))
2013-02-13T00:30:00

julia> round(DateTime(2016, 8, 6, 12, 0, 0), Dates.Day)
2016-08-07T00:00:00

Допустимые режимы округления для round(::TimeType, ::Period, ::RoundingMode) — RoundNearestTiesUp (по умолчанию), RoundDown (floor) и RoundUp (ceil).

исходный код

Большинство значений Period также можно округлить до заданного разрешения:

Base.floorМетод

floor(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> T

Округляет x вниз до ближайшего кратного precision . Если x и precision являются разными подтипами Period, значение результата будет иметь тот же тип, что и precision.

Для удобства, precision может быть типом вместо значения: floor(x, Dates.Hour) является сокращением для floor(x, Dates.Hour(1)).

julia> floor(Dates.Day(16), Dates.Week)
2 weeks

julia> floor(Dates.Minute(44), Dates.Minute(15))
30 minutes

julia> floor(Dates.Hour(36), Dates.Day)
1 day

Округление до кратного precision Month или Year не поддерживается, так как эти Period имеют непостоянную длину.

исходный код

Base.ceilМетод

ceil(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> T

Округляет x вверх до ближайшего кратного precision . Если x и precision являются разными подтипами Period, значение результата будет иметь тот же тип, что и precision.

Для удобства, precision может быть типом вместо значения: ceil(x, Dates.Hour) является сокращением для ceil(x, Dates.Hour(1)).

julia> ceil(Dates.Day(16), Dates.Week)
3 weeks

julia> ceil(Dates.Minute(44), Dates.Minute(15))
45 minutes

julia> ceil(Dates.Hour(36), Dates.Day)
2 days

Округление до кратного precision Month или Year не поддерживается, так как эти Period имеют непостоянную длину.

исходный код

Base.roundМетод

round(x::Period, precision::T, [r::RoundingMode]) where T <: Union{TimePeriod, Week, Day} -> T

Округлить x до ближайшего кратного precision. Если x и precision являются различными подтипами Period, возвращаемое значение будет иметь тот же тип, что и precision. По умолчанию (RoundNearestTiesUp) значения, которые должны быть округлены (например, округление 90 минут до ближайшего часа), будут округляться вверх.

Для удобства precision может быть типом, а не значением: round(x, Dates.Hour) — это сокращение для round(x, Dates.Hour(1)).

julia> round(Dates.Day(16), Dates.Week)
2 weeks

julia> round(Dates.Minute(44), Dates.Minute(15))
45 minutes

julia> round(Dates.Hour(36), Dates.Day)
2 days

Допустимые режимы округления для round(::Period, ::T, ::RoundingMode) — это RoundNearestTiesUp (по умолчанию), RoundDown (floor) и RoundUp (ceil).

Округление до precision кратных Month или Year не поддерживается, так как эти Period имеют непостоянную длину.

источник

Следующие функции не экспортируются:

Dates.floorceilФункция

floorceil(dt::TimeType, p::Period) -> (TimeType, TimeType)

Одновременно возвращают floor и ceil Date или DateTime с разрешением p. Более эффективно, чем вызывать floor и ceil по отдельности.

источник
floorceil(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> (T, T)

Одновременно возвращают floor и ceil Period с разрешением p. Более эффективно, чем вызывать floor и ceil по отдельности.

источник

Dates.epochdays2dateФункция

epochdays2date(days) -> Date

Принимает количество дней с момента эпохи округления (0000-01-01T00:00:00) и возвращает соответствующую Date.

источник

Dates.epochms2datetimeФункция

epochms2datetime(milliseconds) -> DateTime

Принимает количество миллисекунд с момента эпохи округления (0000-01-01T00:00:00) и возвращает соответствующую DateTime.

источник

Dates.date2epochdaysФункция

date2epochdays(dt::Date) -> Int64

Принимает заданную Date и возвращает количество дней с момента эпохи округления (0000-01-01T00:00:00) как Int64.

источник

Dates.datetime2epochmsФункция

datetime2epochms(dt::DateTime) -> Int64

Принимает заданную DateTime и возвращает количество миллисекунд с момента эпохи округления (0000-01-01T00:00:00) как Int64.

источник

Функции преобразования

Dates.todayФункция

today() -> Date

Возвращает дату из now().

источник

Dates.unix2datetimeФункция

unix2datetime(x) -> DateTime

Принимает количество секунд с момента эпохи Unix 1970-01-01T00:00:00 и преобразует в соответствующую DateTime.

источник

Dates.datetime2unixФункция

datetime2unix(dt::DateTime) -> Float64

Принимает заданную DateTime и возвращает количество секунд с момента эпохи Unix 1970-01-01T00:00:00 как Float64.

источник

Dates.julian2datetimeФункция

julian2datetime(julian_days) -> DateTime

Принимает количество дней юлианского календаря с момента эпохи -4713-11-24T12:00:00 и возвращает соответствующую DateTime.

источник

Dates.datetime2julianФункция

datetime2julian(dt::DateTime) -> Float64

Принимает заданную DateTime и возвращает количество дней юлианского календаря с момента юлианской эпохи -4713-11-24T12:00:00 как Float64.

источник

Dates.rata2datetimeФункция

rata2datetime(days) -> DateTime

Принимает количество дней Rata Die с момента эпохи 0000-12-31T00:00:00 и возвращает соответствующую DateTime.

источник

Dates.datetime2rataФункция

datetime2rata(dt::TimeType) -> Int64

Возвращает количество дней Rata Die с момента эпохи, начиная с заданной Date или DateTime.

источник

Константы

Дни недели:

Переменная Сокр. Значение (Int)
Monday Mon 1
Tuesday Tue 2
Wednesday Wed 3
Thursday Thu 4
Friday Fri 5
Saturday Sat 6
Sunday Sun 7

Месяцы года:

Переменная Сокр. Значение (Int)
January Jan 1
February Feb 2
March Mar 3
April Apr 4
May May 5
June Jun 6
July Jul 7
August Aug 8
September Sep 9
October Oct 10
November Nov 11
December Dec 12

Общие форматировщики дат

Dates.ISODateTimeFormatКонстанта

Dates.ISODateTimeFormat

Описывает формат ISO8601 для даты и времени. Это значение по умолчанию для Dates.format объекта DateTime.

Пример

julia> Dates.format(DateTime(2018, 8, 8, 12, 0, 43, 1), ISODateTimeFormat)
"2018-08-08T12:00:43.001"
исходный код

Dates.ISODateFormatКонстанта

Dates.ISODateFormat

Описывает формат ISO8601 для даты. Это значение по умолчанию для Dates.format объекта Date.

Пример

julia> Dates.format(Date(2018, 8, 8), ISODateFormat)
"2018-08-08"
исходный код

Dates.ISOTimeFormatКонстанта

Dates.ISOTimeFormat

Описывает формат ISO8601 для времени. Это значение по умолчанию для Dates.format объекта Time.

Пример

julia> Dates.format(Time(12, 0, 43, 1), ISOTimeFormat)
"12:00:43.001"
исходный код

Dates.RFC1123FormatКонстанта

Dates.RFC1123Format

Описывает формат RFC1123 для даты и времени.

Пример

julia> Dates.format(DateTime(2018, 8, 8, 12, 0, 43, 1), RFC1123Format)
"Wed, 08 Aug 2018 12:00:43"
исходный код
  • 1Понятие UT-секунды на самом деле довольно фундаментально. Существуют в основном два разных понятия времени, которые обычно принимаются: одно основано на физическом вращении Земли (один полный оборот = 1 день), другое основано на СИ-секунде (фиксированное, постоянное значение). Эти понятия радикально отличаются! Подумайте об этом: «UT-секунда», определяемая относительно вращения Земли, может иметь разную абсолютную длину в зависимости от дня! В любом случае, то, что Date и DateTime основаны на UT-секундах, является упрощающим, но честным допущением, чтобы избежать сложностей, связанных с секундами високосных лет и тому подобным. Эта основа времени формально называется UT или UT1. Основание типов на UT-секундах в основном означает, что каждая минута имеет 60 секунд, а каждый день – 24 часа, что приводит к более естественным вычислениям при работе с календарными датами.

© 2009–2021 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.7.0/stdlib/Dates/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API