Источник Дата
Структура Date и функции.
Структура Date содержит поля год, месяц, день и календарь. Новые даты можно создать с помощью функции new/3 или используя сигил ~D (см. sigil_D/2):
iex> ~D[2000-01-01] ~D[2000-01-01]
И функция new/3, и сигил возвращают структуру, где поля даты можно получить напрямую:
iex> date = ~D[2000-01-01] iex> date.year 2000 iex> date.month 1
Функции в этом модуле работают со структурой Date, а также с любой структурой, содержащей те же поля, что и структура Date, например, NaiveDateTime и DateTime. Такие функции ожидают Calendar.date/0 в своих типах (вместо t/0).
Разработчики должны избегать непосредственного создания структур Date и вместо этого полагаться на функции, предоставляемые этим модулем, а также на функции из сторонних библиотек календаря.
Сравнение дат
Сравнения в Elixir с использованием ==/2, >/2, </2 и аналогичных функций являются структурными и основаны на полях структуры Date. Для правильного сравнения дат используйте функцию compare/2. Наличие функции compare/2 в этом модуле также позволяет использовать функции Enum.min/2 и Enum.max/2 для получения минимальной и максимальной даты из набора Enum. Например:
iex> Enum.min([~D[2017-03-31], ~D[2017-04-01]], Date) ~D[2017-03-31]
Использование эпох
Функции add/2 и diff/2 могут использоваться для вычисления дат или получения количества дней между моментами. Например, если есть интерес к вычислению количества дней с момента эпохи Unix (1970-01-01):
iex> Date.diff(~D[2010-04-17], ~D[1970-01-01]) 14716 iex> Date.add(~D[1970-01-01], 14716) ~D[2010-04-17]
Эти функции оптимизированы для работы с распространёнными эпохами, такими как эпоха Unix выше или эпоха Григорианского календаря (0000-01-01).
Краткое описание
Типы
Функции
- add(date, days)
Добавляет заданное количество дней к указанной
date.- after?(date1, date2)
Возвращает
true, если первая дата строго позже второй.- before?(date1, date2)
Возвращает
true, если первая дата строго раньше второй.- beginning_of_month(date)
Вычисляет дату, которая является первым днём месяца для заданной
date.- beginning_of_week(date, starting_on \\ :default)
Вычисляет дату, которая является первым днём недели для заданной
date.- compare(date1, date2)
Сравнивает две структуры дат.
- convert(date, calendar)
Преобразует заданную
dateиз её календаря в заданныйcalendar.- convert!(date, calendar)
Аналогично
Date.convert/2, но вызываетArgumentError, если преобразование между двумя календарями невозможно.- day_of_era(date)
Вычисляет день эпохи и эпоху для заданного календаря
date.- day_of_week(date, starting_on \\ :default)
Вычисляет день недели заданной
date.- day_of_year(date)
Вычисляет день года заданной
date.- days_in_month(date)
Возвращает количество дней в заданном
dateмесяце.- diff(date1, date2)
Вычисляет разницу между двумя датами в полных днях.
- end_of_month(date)
Вычисляет дату, которая является последним днём месяца для заданной
date.- end_of_week(date, starting_on \\ :default)
Вычисляет дату, которая является последним днём недели для заданной
date.- from_erl(tuple, calendar \\ Calendar.ISO)
Преобразует кортеж даты Erlang в структуру
Date.- from_erl!(tuple, calendar \\ Calendar.ISO)
Преобразует кортеж даты Erlang, но вызывает исключение для неверных дат.
- from_gregorian_days(days, calendar \\ Calendar.ISO)
Преобразует количество григорианских дней в структуру
Date.- from_iso8601(string, calendar \\ Calendar.ISO)
Парсит расширенный формат «Даты», описанный в ISO 8601:2019.
- from_iso8601!(string, calendar \\ Calendar.ISO)
Парсит расширенный формат «Даты», описанный в ISO 8601:2019.
- leap_year?(date)
Возвращает
true, если год в заданнойdateявляется високосным.- months_in_year(date)
Возвращает количество месяцев в заданном
dateгоду.- new(year, month, day, calendar \\ Calendar.ISO)
Создаёт новую дату ISO.
- new!(year, month, day, calendar \\ Calendar.ISO)
Создаёт новую дату ISO.
- quarter_of_year(date)
Вычисляет квартал года заданной
date.- range(first, last)
Возвращает диапазон дат.
- range(first, last, step)
Возвращает диапазон дат с шагом.
- to_erl(date)
Преобразует заданную
dateв кортеж даты Erlang.- to_gregorian_days(date)
Преобразует структуру
dateв количество григорианских дней.- to_iso8601(date, format \\ :extended)
Преобразует заданную
dateв ISO 8601:2019.- to_string(date)
Преобразует заданную дату в строку в соответствии с её календарём.
- utc_today(calendar \\ Calendar.ISO)
Возвращает текущую дату в UTC.
- year_of_era(date)
Вычисляет год эпохи и эпоху для заданного года календаря.
Типы
t()Источник
@type t() :: %Date{
calendar: Calendar.calendar(),
day: Calendar.day(),
month: Calendar.month(),
year: Calendar.year()
} Функции
add(date, days)Source
@spec add(Calendar.date(), integer()) :: t()
Добавляет указанное количество дней к заданной date.
Дни считаются как григорианские дни. Дата возвращается в том же календаре, в котором она была задана.
Примеры
iex> Date.add(~D[2000-01-03], -2) ~D[2000-01-01] iex> Date.add(~D[2000-01-01], 2) ~D[2000-01-03] iex> Date.add(~N[2000-01-01 09:00:00], 2) ~D[2000-01-03] iex> Date.add(~D[-0010-01-01], -2) ~D[-0011-12-30]
after?(date1, date2)Source
@spec after?(Calendar.date(), Calendar.date()) :: boolean()
Возвращает true, если первая дата строго позже второй.
Примеры
iex> Date.after?(~D[2022-02-02], ~D[2021-01-01]) true iex> Date.after?(~D[2021-01-01], ~D[2021-01-01]) false iex> Date.after?(~D[2021-01-01], ~D[2022-02-02]) false
before?(date1, date2)Source
@spec before?(Calendar.date(), Calendar.date()) :: boolean()
Возвращает true, если первая дата строго раньше второй.
Примеры
iex> Date.before?(~D[2021-01-01], ~D[2022-02-02]) true iex> Date.before?(~D[2021-01-01], ~D[2021-01-01]) false iex> Date.before?(~D[2022-02-02], ~D[2021-01-01]) false
beginning_of_month(date)Source
@spec beginning_of_month(Calendar.date()) :: t()
Вычисляет дату, которая является первым днём месяца для данной date.
Примеры
iex> Date.beginning_of_month(~D[2000-01-31]) ~D[2000-01-01] iex> Date.beginning_of_month(~D[2000-01-01]) ~D[2000-01-01] iex> Date.beginning_of_month(~N[2000-01-31 01:23:45]) ~D[2000-01-01]
beginning_of_week(date, starting_on \\ :default)Source
@spec beginning_of_week(Calendar.date(), starting_on :: :default | atom()) :: t()
Вычисляет дату, которая является первым днём недели для данной date.
Если день уже является первым днём недели, возвращает сам день. Для встроенного календаря ISO неделя начинается с понедельника. В качестве :default может быть указан день недели, а не starting_on.
Примеры
iex> Date.beginning_of_week(~D[2020-07-11]) ~D[2020-07-06] iex> Date.beginning_of_week(~D[2020-07-06]) ~D[2020-07-06] iex> Date.beginning_of_week(~D[2020-07-11], :sunday) ~D[2020-07-05] iex> Date.beginning_of_week(~D[2020-07-11], :saturday) ~D[2020-07-11] iex> Date.beginning_of_week(~N[2020-07-11 01:23:45]) ~D[2020-07-06]
compare(date1, date2)Source
@spec compare(Calendar.date(), Calendar.date()) :: :lt | :eq | :gt
Сравнивает две структуры дат.
Возвращает :gt если первая дата позже второй и :lt в обратном случае. Если две даты равны, возвращается :eq.
Примеры
iex> Date.compare(~D[2016-04-16], ~D[2016-04-28]) :lt
Эта функция также может быть использована для сравнения более сложных типов календарей, учитывая только поля даты:
iex> Date.compare(~D[2016-04-16], ~N[2016-04-28 01:23:45]) :lt iex> Date.compare(~D[2016-04-16], ~N[2016-04-16 01:23:45]) :eq iex> Date.compare(~N[2016-04-16 12:34:56], ~N[2016-04-16 01:23:45]) :eq
convert(date, calendar)Source
@spec convert(Calendar.date(), Calendar.calendar()) ::
{:ok, t()} | {:error, :incompatible_calendars} Преобразует заданную date из её календаря в заданный calendar.
Возвращает {:ok, date} если календари совместимы, или {:error, :incompatible_calendars} если они несовместимы.
См. также Calendar.compatible_calendars?/2.
Примеры
Представьте, что кто-то реализовал Calendar.Holocene, календарь, основанный на григорианском календаре, который добавляет ровно 10 000 лет к текущему григорианскому году:
iex> Date.convert(~D[2000-01-01], Calendar.Holocene)
{:ok, %Date{calendar: Calendar.Holocene, year: 12000, month: 1, day: 1}} convert!(date, calendar)Source
@spec convert!(Calendar.date(), Calendar.calendar()) :: t()
Аналогично Date.convert/2, но вызывает исключение ArgumentError, если преобразование между двумя календарями невозможно.
Примеры
Представьте, что кто-то реализовал Calendar.Holocene, календарь, основанный на григорианском календаре, который добавляет ровно 10 000 лет к текущему григорианскому году:
iex> Date.convert!(~D[2000-01-01], Calendar.Holocene)
%Date{calendar: Calendar.Holocene, year: 12000, month: 1, day: 1} day_of_era(date)Source
@spec day_of_era(Calendar.date()) :: {Calendar.day(), non_neg_integer()} Вычисляет день эры и эру для данного календаря date.
Возвращает кортеж {day, era}, представляющий день в рамках эры и номер эры.
Примеры
iex> Date.day_of_era(~D[0001-01-01])
{1, 1}
iex> Date.day_of_era(~D[0000-12-31])
{1, 0} day_of_week(date, starting_on \\ :default)Source
@spec day_of_week(Calendar.date(), starting_on :: :default | atom()) :: Calendar.day_of_week()
Вычисляет день недели для заданной date.
Возвращает день недели как целое число. Для календаря ISO 8601 (по умолчанию) это целое число от 1 до 7, где 1 - понедельник, а 7 - воскресенье.
Может быть передан необязательное значение starting_on, которое настраивает день недели, с которого начинается неделя. Значение по умолчанию - :default, что соответствует :monday для встроенного календаря ISO. Любой другой день недели может быть указан.
Примеры
iex> Date.day_of_week(~D[2016-10-31]) 1 iex> Date.day_of_week(~D[2016-11-01]) 2 iex> Date.day_of_week(~N[2016-11-01 01:23:45]) 2 iex> Date.day_of_week(~D[-0015-10-30]) 3 iex> Date.day_of_week(~D[2016-10-31], :sunday) 2 iex> Date.day_of_week(~D[2016-11-01], :sunday) 3 iex> Date.day_of_week(~N[2016-11-01 01:23:45], :sunday) 3 iex> Date.day_of_week(~D[-0015-10-30], :sunday) 4
day_of_year(date)Source
@spec day_of_year(Calendar.date()) :: Calendar.day()
Вычисляет день года для заданной date.
Возвращает день года как целое число. Для календаря ISO 8601 (по умолчанию) это целое число от 1 до 366.
Примеры
iex> Date.day_of_year(~D[2016-01-01]) 1 iex> Date.day_of_year(~D[2016-11-01]) 306 iex> Date.day_of_year(~D[-0015-10-30]) 303 iex> Date.day_of_year(~D[2004-12-31]) 366
days_in_month(date)Source
@spec days_in_month(Calendar.date()) :: Calendar.day()
Возвращает количество дней в данном месяце date.
Примеры
iex> Date.days_in_month(~D[1900-01-13]) 31 iex> Date.days_in_month(~D[1900-02-09]) 28 iex> Date.days_in_month(~N[2000-02-20 01:23:45]) 29
diff(date1, date2)Source
@spec diff(Calendar.date(), Calendar.date()) :: integer()
Вычисляет разницу между двумя датами в полных днях.
Возвращает количество григорианских дней между датами. Для сравнения таким образом допускаются только структуры Date, которые следуют одному или совместимым календарям. Если два календаря несовместимы, возникает исключение.
Примеры
iex> Date.diff(~D[2000-01-03], ~D[2000-01-01]) 2 iex> Date.diff(~D[2000-01-01], ~D[2000-01-03]) -2 iex> Date.diff(~D[0000-01-02], ~D[-0001-12-30]) 3 iex> Date.diff(~D[2000-01-01], ~N[2000-01-03 09:00:00]) -2
end_of_month(date)Source
@spec end_of_month(Calendar.date()) :: t()
Вычисляет дату, которая является последним днём месяца для данной date.
Примеры
iex> Date.end_of_month(~D[2000-01-01]) ~D[2000-01-31] iex> Date.end_of_month(~D[2000-01-31]) ~D[2000-01-31] iex> Date.end_of_month(~N[2000-01-01 01:23:45]) ~D[2000-01-31]
end_of_week(date, starting_on \\ :default)Source
@spec end_of_week(Calendar.date(), starting_on :: :default | atom()) :: t()
Вычисляет дату, которая является последним днём недели для данной date.
Если день уже является последним днём недели, возвращает сам день. Для встроенного календаря ISO неделя заканчивается в воскресенье. В качестве :default может быть указан день недели, а не starting_on.
Примеры
iex> Date.end_of_week(~D[2020-07-11]) ~D[2020-07-12] iex> Date.end_of_week(~D[2020-07-05]) ~D[2020-07-05] iex> Date.end_of_week(~D[2020-07-06], :sunday) ~D[2020-07-11] iex> Date.end_of_week(~D[2020-07-06], :saturday) ~D[2020-07-10] iex> Date.end_of_week(~N[2020-07-11 01:23:45]) ~D[2020-07-12]
from_erl(tuple, calendar \\ Calendar.ISO)Source
@spec from_erl(:calendar.date(), Calendar.calendar()) :: {:ok, t()} | {:error, atom()} Преобразует кортеж Erlang даты в структуру Date.
Поддерживает только преобразование дат, которые находятся в календаре ISO, или других календарях, в которых дни также начинаются с полуночи. Попытка преобразования дат из других календарей вернёт кортеж ошибки.
Примеры
iex> Date.from_erl({2000, 1, 1})
{:ok, ~D[2000-01-01]}
iex> Date.from_erl({2000, 13, 1})
{:error, :invalid_date} from_erl!(tuple, calendar \\ Calendar.ISO)Source
@spec from_erl!(:calendar.date(), Calendar.calendar()) :: t()
Преобразует кортеж Erlang даты, но при некорректных датах вызывает исключение.
Примеры
iex> Date.from_erl!({2000, 1, 1})
~D[2000-01-01]
iex> Date.from_erl!({2000, 13, 1})
** (ArgumentError) cannot convert {2000, 13, 1} to date, reason: :invalid_date from_gregorian_days(days, calendar \\ Calendar.ISO)Source
@spec from_gregorian_days(integer(), Calendar.calendar()) :: t()
Преобразует количество григорианских дней в структуру Date.
Примеры
iex> Date.from_gregorian_days(1) ~D[0000-01-02] iex> Date.from_gregorian_days(730_485) ~D[2000-01-01] iex> Date.from_gregorian_days(-1) ~D[-0001-12-31]
from_iso8601(string, calendar \\ Calendar.ISO)Source
@spec from_iso8601(String.t(), Calendar.calendar()) :: {:ok, t()} | {:error, atom()} Парсит расширенный формат дат, описанный в ISO 8601:2019.
Год, парсируемый этой функцией, ограничен четырьмя цифрами.
Примеры
iex> Date.from_iso8601("2015-01-23")
{:ok, ~D[2015-01-23]}
iex> Date.from_iso8601("2015:01:23")
{:error, :invalid_format}
iex> Date.from_iso8601("2015-01-32")
{:error, :invalid_date} from_iso8601!(string, calendar \\ Calendar.ISO)Source
@spec from_iso8601!(String.t(), Calendar.calendar()) :: t()
Парсит расширенный формат дат, описанный в ISO 8601:2019.
Вызывает исключение, если формат неверен.
Примеры
iex> Date.from_iso8601!("2015-01-23")
~D[2015-01-23]
iex> Date.from_iso8601!("2015:01:23")
** (ArgumentError) cannot parse "2015:01:23" as date, reason: :invalid_format leap_year?(date)Source
@spec leap_year?(Calendar.date()) :: boolean()
Возвращает true, если год в заданном date является високосным.
Примеры
iex> Date.leap_year?(~D[2000-01-01]) true iex> Date.leap_year?(~D[2001-01-01]) false iex> Date.leap_year?(~D[2004-01-01]) true iex> Date.leap_year?(~D[1900-01-01]) false iex> Date.leap_year?(~N[2004-01-01 01:23:45]) true
months_in_year(date)Source
@spec months_in_year(Calendar.date()) :: Calendar.month()
Возвращает количество месяцев в заданном date году.
Пример
iex> Date.months_in_year(~D[1900-01-13]) 12
new(year, month, day, calendar \\ Calendar.ISO)Source
@spec new(Calendar.year(), Calendar.month(), Calendar.day(), Calendar.calendar()) ::
{:ok, t()} | {:error, atom()} Создаёт новую дату ISO.
Ожидает все значения в виде целых чисел. Возвращает {:ok, date} если каждое значение находится в допустимом диапазоне, возвращает {:error, reason} в противном случае.
Примеры
iex> Date.new(2000, 1, 1)
{:ok, ~D[2000-01-01]}
iex> Date.new(2000, 13, 1)
{:error, :invalid_date}
iex> Date.new(2000, 2, 29)
{:ok, ~D[2000-02-29]}
iex> Date.new(2000, 2, 30)
{:error, :invalid_date}
iex> Date.new(2001, 2, 29)
{:error, :invalid_date} new!(year, month, day, calendar \\ Calendar.ISO)Source
@spec new!(Calendar.year(), Calendar.month(), Calendar.day(), Calendar.calendar()) :: t()
Создаёт новую дату ISO.
Ожидает все значения в виде целых чисел. Возвращает date если каждое значение находится в допустимом диапазоне, вызывает исключение, если дата неверна.
Примеры
iex> Date.new!(2000, 1, 1) ~D[2000-01-01] iex> Date.new!(2000, 13, 1) ** (ArgumentError) cannot build date, reason: :invalid_date iex> Date.new!(2000, 2, 29) ~D[2000-02-29]
quarter_of_year(date)Source
@spec quarter_of_year(Calendar.date()) :: non_neg_integer()
Вычисляет квартал года заданной date.
Возвращает день года как целое число. Для календаря ISO 8601 (по умолчанию) это целое число от 1 до 4.
Примеры
iex> Date.quarter_of_year(~D[2016-10-31]) 4 iex> Date.quarter_of_year(~D[2016-01-01]) 1 iex> Date.quarter_of_year(~N[2016-04-01 01:23:45]) 2 iex> Date.quarter_of_year(~D[-0015-09-30]) 3
range(first, last)Source
@spec range(Calendar.date(), Calendar.date()) :: Date.Range.t()
Возвращает диапазон дат.
Диапазон дат представляет собой дискретное количество дат, где начальное и конечное значения — это даты с совпадающими календарями.
Диапазоны дат могут быть возрастающими (first <= last) и всегда включают крайние значения. Для убывающего диапазона используйте range/3 с шагом -1 в качестве первого аргумента.
Примеры
iex> Date.range(~D[1999-01-01], ~D[2000-01-01]) Date.range(~D[1999-01-01], ~D[2000-01-01])
Диапазон дат реализует протокол Enumerable, что означает, что функции из модуля Enum могут использоваться для работы с диапазонами:
iex> range = Date.range(~D[2001-01-01], ~D[2002-01-01]) iex> range Date.range(~D[2001-01-01], ~D[2002-01-01]) iex> Enum.count(range) 366 iex> ~D[2001-02-01] in range true iex> Enum.take(range, 3) [~D[2001-01-01], ~D[2001-01-02], ~D[2001-01-03]]
range(first, last, step)Source
@spec range(Calendar.date(), Calendar.date(), step :: pos_integer() | neg_integer()) :: Date.Range.t()
Возвращает диапазон дат с шагом.
Примеры
iex> range = Date.range(~D[2001-01-01], ~D[2002-01-01], 2) iex> range Date.range(~D[2001-01-01], ~D[2002-01-01], 2) iex> Enum.count(range) 183 iex> ~D[2001-01-03] in range true iex> Enum.take(range, 3) [~D[2001-01-01], ~D[2001-01-03], ~D[2001-01-05]]
to_erl(date)Source
@spec to_erl(Calendar.date()) :: :calendar.date()
Преобразует данную date в кортеж Erlang для даты.
Поддерживает только преобразование дат, которые находятся в календаре ISO или других календарях, в которых дни также начинаются в полночь. Попытка преобразования дат из других календарей вызовет исключение.
Примеры
iex> Date.to_erl(~D[2000-01-01])
{2000, 1, 1}
iex> Date.to_erl(~N[2000-01-01 00:00:00])
{2000, 1, 1} to_gregorian_days(date)Source
@spec to_gregorian_days(Calendar.date()) :: integer()
Преобразует структуру date в количество григорианских дней.
Примеры
iex> Date.to_gregorian_days(~D[0000-01-02]) 1 iex> Date.to_gregorian_days(~D[2000-01-01]) 730_485 iex> Date.to_gregorian_days(~N[2000-01-01 00:00:00]) 730_485
to_iso8601(date, format \\ :extended)Source
@spec to_iso8601(Calendar.date(), :extended | :basic) :: String.t()
Преобразует заданную date в ISO 8601:2019.
По умолчанию Date.to_iso8601/2 возвращает даты в формате «расширенный» для удобства чтения человеком. Также поддерживается формат «базовый» через опцию :basic.
Поддерживает только преобразование дат, которые находятся в календаре ISO или других календарях, в которых дни также начинаются в полночь. Попытка преобразования дат из других календарей вызовет исключение ArgumentError.
Примеры
iex> Date.to_iso8601(~D[2000-02-28]) "2000-02-28" iex> Date.to_iso8601(~D[2000-02-28], :basic) "20000228" iex> Date.to_iso8601(~N[2000-02-28 00:00:00]) "2000-02-28"
to_string(date)Source
@spec to_string(Calendar.date()) :: String.t()
Преобразует заданную дату в строку в соответствии с её календарём.
Примеры
iex> Date.to_string(~D[2000-02-28]) "2000-02-28" iex> Date.to_string(~N[2000-02-28 01:23:45]) "2000-02-28" iex> Date.to_string(~D[-0100-12-15]) "-0100-12-15"
utc_today(calendar \\ Calendar.ISO)Source
@spec utc_today(Calendar.calendar()) :: t()
Возвращает текущую дату в UTC.
Примеры
iex> date = Date.utc_today() iex> date.year >= 2016 true
year_of_era(date)Source
@spec year_of_era(Calendar.date()) :: {Calendar.year(), non_neg_integer()} Вычисляет год эпохи и номер эпохи для данного года календаря.
Возвращает кортеж {year, era} представляющий год в эпохе и номер эпохи.
Примеры
iex> Date.year_of_era(~D[0001-01-01])
{1, 1}
iex> Date.year_of_era(~D[0000-12-31])
{1, 0}
iex> Date.year_of_era(~D[-0001-01-01])
{2, 0}
© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.16.3/Date.html