Spec-Zone.ru › Elixir 1.17

Исходный код NaiveDateTime

Структура NaiveDateTime (без часового пояса) и функции.

Структура NaiveDateTime содержит поля год, месяц, день, час, минута, секунда, микросекунда и календарь. Новые даты и времена без часового пояса можно создать с помощью функций new/2 и new/8 или используя сигил ~N (см. sigil_N/2):

iex> ~N[2000-01-01 23:00:07]
~N[2000-01-01 23:00:07]

К полям даты и времени в структуре можно получить доступ напрямую:

iex> naive = ~N[2000-01-01 23:00:07]
iex> naive.year
2000
iex> naive.second
7

Мы называем их "наивными", потому что эта модель даты и времени не имеет часового пояса. Это означает, что дата и время могут фактически не существовать в определенных регионах мира, даже если они являются допустимыми.

Например, когда применяются изменения летнего времени в регионе, время, как правило, переводится вперед или назад на один час. Это означает, что определенные даты и времена никогда не происходят или могут происходить более одного раза. Поскольку NaiveDateTime не проверяется по отношению к часовому поясу, такие ошибки останутся незамеченными.

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

Сравнение наивных дат и времени

Сравнения в Elixir с использованием ==/2, >/2, </2 и аналогичных функций являются структурными и основаны на полях структуры NaiveDateTime. Для корректного сравнения наивных дат и времени используйте функцию compare/2. Наличие функции compare/2 в этом модуле также позволяет использовать функции Enum.min/2 и Enum.max/2 для получения минимальной и максимальной наивной даты и времени для Enum. Например:

iex> Enum.min([~N[2020-01-01 23:00:07], ~N[2000-01-01 23:00:07]], NaiveDateTime)
~N[2000-01-01 23:00:07]

Использование эпох

Функции add/3 и diff/3 можно использовать для вычисления дат и времени или получения количества секунд между моментами. Например, если нужно вычислить количество секунд с начала эпохи Unix (1970-01-01 00:00:00):

iex> NaiveDateTime.diff(~N[2010-04-17 14:00:00], ~N[1970-01-01 00:00:00])
1271512800

iex> NaiveDateTime.add(~N[1970-01-01 00:00:00], 1_271_512_800)
~N[2010-04-17 14:00:00]

Эти функции оптимизированы для работы с общими эпохами, такими как эпоха Unix или эпоха Григорианского календаря (0000-01-01 00:00:00).

Краткое описание

Типы

t()

Функции

add(naive_datetime, amount_to_add, unit \\ :second)

Добавляет указанное количество времени к NaiveDateTime.

after?(naive_datetime1, naive_datetime2)

Возвращает true, если первая NaiveDateTime строго позже второй.

before?(naive_datetime1, naive_datetime2)

Возвращает true, если первая NaiveDateTime строго раньше второй.

beginning_of_day(naive_datetime)

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

compare(naive_datetime1, naive_datetime2)

Сравнивает две структуры NaiveDateTime.

convert(naive_datetime, calendar)

Преобразует данную naive_datetime из одного календаря в другой.

convert!(naive_datetime, calendar)

Преобразует данную naive_datetime из одного календаря в другой.

diff(naive_datetime1, naive_datetime2, unit \\ :second)

Вычитает naive_datetime2 из naive_datetime1.

end_of_day(naive_datetime)

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

from_erl(tuple, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)

Преобразует кортеж Erlang datetime в структуру NaiveDateTime.

from_erl!(tuple, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)

Преобразует кортеж Erlang datetime в структуру NaiveDateTime.

from_gregorian_seconds(seconds, microsecond_precision \\ {0, 0}, calendar \\ Calendar.ISO)

Преобразует количество григорианских секунд в структуру NaiveDateTime.

from_iso8601(string, calendar \\ Calendar.ISO)

Парсит расширенный формат «Дата и время суток», описанный в ISO 8601:2019.

from_iso8601!(string, calendar \\ Calendar.ISO)

Парсит расширенный формат «Дата и время суток», описанный в ISO 8601:2019.

local_now(calendar \\ Calendar.ISO)

Возвращает «местное время» для машины, на которой выполняется программа Elixir.

new(date, time)

Создаёт naive datetime из структур date и time.

new(year, month, day, hour, minute, second, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)

Создаёт новую структуру ISO naive datetime.

new!(date, time)

Создаёт naive datetime из структур date и time.

new!(year, month, day, hour, minute, second, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)

Создаёт новую структуру ISO naive datetime.

shift(naive_datetime, duration)

Смещает данный naive_datetime на duration в соответствии с его календарём.

to_date(map)

Преобразует NaiveDateTime в Date.

to_erl(naive_datetime)

Преобразует структуру NaiveDateTime в кортеж Erlang datetime.

to_gregorian_seconds(map)

Преобразует структуру NaiveDateTime в количество григорианских секунд и микросекунд.

to_iso8601(naive_datetime, format \\ :extended)

Преобразует заданную naive datetime в формат ISO 8601:2019.

to_string(naive_datetime)

Преобразует заданную naive datetime в строку в соответствии с её календарём.

to_time(map)

Преобразует NaiveDateTime в Time.

truncate(naive_datetime, precision)

Возвращает заданную naive datetime с полем microsecond, усечённым до указанной точности (:microsecond, :millisecond или :second).

utc_now(calendar_or_time_unit \\ Calendar.ISO)

Возвращает текущую naive datetime в UTC.

utc_now(time_unit, calendar)

Возвращает текущую naive datetime в UTC, поддерживающую определённый календарь и точность.

Типы

t()Source

@type t() :: %NaiveDateTime{
  calendar: Calendar.calendar(),
  day: Calendar.day(),
  hour: Calendar.hour(),
  microsecond: Calendar.microsecond(),
  minute: Calendar.minute(),
  month: Calendar.month(),
  second: Calendar.second(),
  year: Calendar.year()
}
END_OF_DOCUMENT_MARKER

Функции

add(naive_datetime, amount_to_add, unit \\ :second)Source

@spec add(
  Calendar.naive_datetime(),
  integer(),
  :day | :hour | :minute | System.time_unit()
) :: t()

Добавляет указанное количество времени к NaiveDateTime.

Принимает amount_to_add в любом unit. unit может быть :day, :hour, :minute, :second или любой точностью до долей секунды из System.time_unit/0. По умолчанию используется :second. Отрицательные значения будут смещать во времени назад.

Эта функция всегда учитывает единицы измерения, вычисленные в соответствии с Calendar.ISO.

Примеры

По умолчанию используется секунды:

# adds seconds by default
iex> NaiveDateTime.add(~N[2014-10-02 00:29:10], 2)
~N[2014-10-02 00:29:12]

# accepts negative offsets
iex> NaiveDateTime.add(~N[2014-10-02 00:29:10], -2)
~N[2014-10-02 00:29:08]

Также может работать с точностью до долей секунды:

iex> NaiveDateTime.add(~N[2014-10-02 00:29:10], 2_000, :millisecond)
~N[2014-10-02 00:29:12.000]

А также с днями/часами/минутами:

iex> NaiveDateTime.add(~N[2015-02-28 00:29:10], 2, :day)
~N[2015-03-02 00:29:10]
iex> NaiveDateTime.add(~N[2015-02-28 00:29:10], 36, :hour)
~N[2015-03-01 12:29:10]
iex> NaiveDateTime.add(~N[2015-02-28 00:29:10], 60, :minute)
~N[2015-02-28 01:29:10]

Эта операция объединяет точность даты и времени без учета часового пояса с заданной единицей измерения:

iex> result = NaiveDateTime.add(~N[2014-10-02 00:29:10], 21, :millisecond)
~N[2014-10-02 00:29:10.021]
iex> result.microsecond
{21000, 3}

Операции с использованием времени в секундах по григорианскому календарю или времени Unix оптимизированы:

# from Gregorian seconds
iex> NaiveDateTime.add(~N[0000-01-01 00:00:00], 63_579_428_950)
~N[2014-10-02 00:29:10]

Передача DateTime автоматически преобразует ее в NaiveDateTime, отбрасывая информацию о часовом поясе:

iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
...>                hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...>                utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
iex> NaiveDateTime.add(dt, 21, :second)
~N[2000-02-29 23:00:28]

Чтобы сместить дату и время без учета часового пояса на Duration и согласно его базовому календарю, используйте NaiveDateTime.shift/2.

after?(naive_datetime1, naive_datetime2)Source

@spec after?(Calendar.naive_datetime(), Calendar.naive_datetime()) :: boolean()

Возвращает true если первое NaiveDateTime строго позже второго.

Примеры

iex> NaiveDateTime.after?(~N[2022-02-02 11:00:00], ~N[2021-01-01 11:00:00])
true
iex> NaiveDateTime.after?(~N[2021-01-01 11:00:00], ~N[2021-01-01 11:00:00])
false
iex> NaiveDateTime.after?(~N[2021-01-01 11:00:00], ~N[2022-02-02 11:00:00])
false

before?(naive_datetime1, naive_datetime2)Source

@spec before?(Calendar.naive_datetime(), Calendar.naive_datetime()) :: boolean()

Возвращает true если первое NaiveDateTime строго раньше второго.

Примеры

iex> NaiveDateTime.before?(~N[2021-01-01 11:00:00], ~N[2022-02-02 11:00:00])
true
iex> NaiveDateTime.before?(~N[2021-01-01 11:00:00], ~N[2021-01-01 11:00:00])
false
iex> NaiveDateTime.before?(~N[2022-02-02 11:00:00], ~N[2021-01-01 11:00:00])
false

beginning_of_day(naive_datetime)Source

@spec beginning_of_day(Calendar.naive_datetime()) :: t()

Вычисляет NaiveDateTime, который является первым моментом для данного NaiveDateTime.

Чтобы вычислить начало дня для DateTime, вызовите эту функцию, а затем преобразуйте обратно в DateTime:

datetime
|> NaiveDateTime.beginning_of_day()
|> DateTime.from_naive(datetime.time_zone)

Обратите внимание, что начало дня может отсутствовать или быть неоднозначным в заданном часовом поясе, поэтому вы должны обработать эти случаи соответствующим образом.

Примеры

iex> NaiveDateTime.beginning_of_day(~N[2000-01-01 23:00:07.123456])
~N[2000-01-01 00:00:00.000000]

compare(naive_datetime1, naive_datetime2)Source

@spec compare(Calendar.naive_datetime(), Calendar.naive_datetime()) :: :lt | :eq | :gt

Сравнивает две структуры NaiveDateTime.

Возвращает :gt если первое значение больше второго и :lt в обратном случае. Если две даты NaiveDateTime равны, возвращается :eq.

Примеры

iex> NaiveDateTime.compare(~N[2016-04-16 13:30:15], ~N[2016-04-28 16:19:25])
:lt
iex> NaiveDateTime.compare(~N[2016-04-16 13:30:15.1], ~N[2016-04-16 13:30:15.01])
:gt

Эта функция также может использоваться для сравнения DateTime без информации о часовом поясе:

iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
...>                hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...>                utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
iex> NaiveDateTime.compare(dt, ~N[2000-02-29 23:00:07])
:eq
iex> NaiveDateTime.compare(dt, ~N[2000-01-29 23:00:07])
:gt
iex> NaiveDateTime.compare(dt, ~N[2000-03-29 23:00:07])
:lt

convert(naive_datetime, calendar)Source

@spec convert(Calendar.naive_datetime(), Calendar.calendar()) ::
  {:ok, t()} | {:error, :incompatible_calendars}

Преобразует заданную naive_datetime из одного календаря в другой.

Если невозможно однозначно преобразовать между календарями (см. Calendar.compatible_calendars?/2), возвращается кортеж {:error, :incompatible_calendars}.

Примеры

Представьте, что кто-то реализует Calendar.Holocene, календарь, основанный на григорианском календаре, который добавляет ровно 10 000 лет к текущему григорианскому году:

iex> NaiveDateTime.convert(~N[2000-01-01 13:30:15], Calendar.Holocene)
{:ok, %NaiveDateTime{calendar: Calendar.Holocene, year: 12000, month: 1, day: 1,
                     hour: 13, minute: 30, second: 15, microsecond: {0, 0}}}

convert!(naive_datetime, calendar)Source

@spec convert!(Calendar.naive_datetime(), Calendar.calendar()) :: t()

Преобразует заданную naive_datetime из одного календаря в другой.

Если невозможно однозначно преобразовать между календарями (см. Calendar.compatible_calendars?/2), генерируется исключение ArgumentError.

Примеры

Представьте, что кто-то реализует Calendar.Holocene, календарь, основанный на григорианском календаре, который добавляет ровно 10 000 лет к текущему григорианскому году:

iex> NaiveDateTime.convert!(~N[2000-01-01 13:30:15], Calendar.Holocene)
%NaiveDateTime{calendar: Calendar.Holocene, year: 12000, month: 1, day: 1,
               hour: 13, minute: 30, second: 15, microsecond: {0, 0}}

diff(naive_datetime1, naive_datetime2, unit \\ :second)Source

@spec diff(
  Calendar.naive_datetime(),
  Calendar.naive_datetime(),
  :day | :hour | :minute | System.time_unit()
) :: integer()

Вычисляет разницу между naive_datetime2 и naive_datetime1.

Результат может быть возвращен в любой :day, :hour, :minute, или любой unit единице измерения, доступной из System.time_unit/0. Единицы измерения измеряются в соответствии с Calendar.ISO и по умолчанию равны :second.

Дробные результаты не поддерживаются и усекаются.

Примеры

iex> NaiveDateTime.diff(~N[2014-10-02 00:29:12], ~N[2014-10-02 00:29:10])
2
iex> NaiveDateTime.diff(~N[2014-10-02 00:29:12], ~N[2014-10-02 00:29:10], :microsecond)
2_000_000

iex> NaiveDateTime.diff(~N[2014-10-02 00:29:10.042], ~N[2014-10-02 00:29:10.021])
0
iex> NaiveDateTime.diff(~N[2014-10-02 00:29:10.042], ~N[2014-10-02 00:29:10.021], :millisecond)
21

iex> NaiveDateTime.diff(~N[2014-10-02 00:29:10], ~N[2014-10-02 00:29:12])
-2
iex> NaiveDateTime.diff(~N[-0001-10-02 00:29:10], ~N[-0001-10-02 00:29:12])
-2

Также может вычислить разницу в днях, часах или минутах:

iex> NaiveDateTime.diff(~N[2014-10-10 00:29:10], ~N[2014-10-02 00:29:10], :day)
8
iex> NaiveDateTime.diff(~N[2014-10-02 12:29:10], ~N[2014-10-02 00:29:10], :hour)
12
iex> NaiveDateTime.diff(~N[2014-10-02 00:39:10], ~N[2014-10-02 00:29:10], :minute)
10

Но неполные дни округляются до нуля:

iex> NaiveDateTime.diff(~N[2014-10-10 00:29:09], ~N[2014-10-02 00:29:10], :day)
7

end_of_day(naive_datetime)Source

@spec end_of_day(Calendar.naive_datetime()) :: t()

Вычисляет NaiveDateTime, который является последним моментом для данного NaiveDateTime.

Чтобы вычислить конец дня для DateTime, вызовите эту функцию, а затем преобразуйте обратно в DateTime:

datetime
|> NaiveDateTime.end_of_day()
|> DateTime.from_naive(datetime.time_zone)

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

Примеры

iex> NaiveDateTime.end_of_day(~N[2000-01-01 23:00:07.123456])
~N[2000-01-01 23:59:59.999999]

from_erl(tuple, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)Source

@spec from_erl(:calendar.datetime(), Calendar.microsecond(), Calendar.calendar()) ::
  {:ok, t()} | {:error, atom()}

Преобразует кортеж Erlang datetime в структуру NaiveDateTime.

Попытка преобразования некорректной даты календаря ISO приведет к ошибке.

Примеры

iex> NaiveDateTime.from_erl({{2000, 1, 1}, {13, 30, 15}})
{:ok, ~N[2000-01-01 13:30:15]}
iex> NaiveDateTime.from_erl({{2000, 1, 1}, {13, 30, 15}}, {5000, 3})
{:ok, ~N[2000-01-01 13:30:15.005]}
iex> NaiveDateTime.from_erl({{2000, 13, 1}, {13, 30, 15}})
{:error, :invalid_date}
iex> NaiveDateTime.from_erl({{2000, 13, 1}, {13, 30, 15}})
{:error, :invalid_date}

from_erl!(tuple, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)Source

@spec from_erl!(:calendar.datetime(), Calendar.microsecond(), Calendar.calendar()) ::
  t()

Преобразует кортеж Erlang datetime в структуру NaiveDateTime.

Вызовет исключение, если datetime некорректен. Попытка преобразования некорректной даты календаря ISO приведет к ошибке.

Примеры

iex> NaiveDateTime.from_erl!({{2000, 1, 1}, {13, 30, 15}})
~N[2000-01-01 13:30:15]
iex> NaiveDateTime.from_erl!({{2000, 1, 1}, {13, 30, 15}}, {5000, 3})
~N[2000-01-01 13:30:15.005]
iex> NaiveDateTime.from_erl!({{2000, 13, 1}, {13, 30, 15}})
** (ArgumentError) cannot convert {{2000, 13, 1}, {13, 30, 15}} to naive datetime, reason: :invalid_date

from_gregorian_seconds(seconds, microsecond_precision \\ {0, 0}, calendar \\ Calendar.ISO)Source

@spec from_gregorian_seconds(integer(), Calendar.microsecond(), Calendar.calendar()) ::
  t()

Преобразует количество секунд по григорианскому календарю в структуру NaiveDateTime.

Примеры

iex> NaiveDateTime.from_gregorian_seconds(1)
~N[0000-01-01 00:00:01]
iex> NaiveDateTime.from_gregorian_seconds(63_755_511_991, {5000, 3})
~N[2020-05-01 00:26:31.005]
iex> NaiveDateTime.from_gregorian_seconds(-1)
~N[-0001-12-31 23:59:59]

from_iso8601(строка, календарь \\ Calendar.ISO)Источник

@spec from_iso8601(String.t(), Calendar.calendar()) :: {:ok, t()} | {:error, atom()}

Парсит расширенный формат «Дата и время» описанный в ISO 8601:2019.

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

Как указано в стандарте, разделитель «T» может быть опущен, если это необходимо, так как в этой функции нет неоднозначности.

Обратите внимание, что високосные секунды не поддерживаются встроенным Calendar.ISO.

Примеры

iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07")
{:ok, ~N[2015-01-23 23:50:07]}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07")
{:ok, ~N[2015-01-23 23:50:07]}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07Z")
{:ok, ~N[2015-01-23 23:50:07]}

iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07.0")
{:ok, ~N[2015-01-23 23:50:07.0]}
iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07,0123456")
{:ok, ~N[2015-01-23 23:50:07.012345]}
iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07.0123456")
{:ok, ~N[2015-01-23 23:50:07.012345]}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07.123Z")
{:ok, ~N[2015-01-23 23:50:07.123]}

iex> NaiveDateTime.from_iso8601("2015-01-23P23:50:07")
{:error, :invalid_format}
iex> NaiveDateTime.from_iso8601("2015:01:23 23-50-07")
{:error, :invalid_format}
iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07A")
{:error, :invalid_format}
iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:61")
{:error, :invalid_time}
iex> NaiveDateTime.from_iso8601("2015-01-32 23:50:07")
{:error, :invalid_date}

iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07.123+02:30")
{:ok, ~N[2015-01-23 23:50:07.123]}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07.123+00:00")
{:ok, ~N[2015-01-23 23:50:07.123]}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07.123-02:30")
{:ok, ~N[2015-01-23 23:50:07.123]}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07.123-00:00")
{:error, :invalid_format}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07.123-00:60")
{:error, :invalid_format}
iex> NaiveDateTime.from_iso8601("2015-01-23T23:50:07.123-24:00")
{:error, :invalid_format}

from_iso8601!(строка, календарь \\ Calendar.ISO)Источник

@spec from_iso8601!(String.t(), Calendar.calendar()) :: t()

Парсит расширенный формат «Дата и время» описанный в ISO 8601:2019.

Выбрасывает исключение, если формат некорректен.

Примеры

iex> NaiveDateTime.from_iso8601!("2015-01-23T23:50:07.123Z")
~N[2015-01-23 23:50:07.123]
iex> NaiveDateTime.from_iso8601!("2015-01-23T23:50:07,123Z")
~N[2015-01-23 23:50:07.123]
iex> NaiveDateTime.from_iso8601!("2015-01-23P23:50:07")
** (ArgumentError) cannot parse "2015-01-23P23:50:07" as naive datetime, reason: :invalid_format

local_now(календарь \\ Calendar.ISO)Источник

@spec local_now(Calendar.calendar()) :: t()

Возвращает «местное время» для машины, на которой выполняется программа Elixir.

ВНИМАНИЕ: Эта функция может привести к скрытым ошибкам. Она зависит от конфигурации часового пояса во время выполнения. Это может измениться и быть установлено в часовой пояс, который имеет переходы по летнему/зимнему времени (переход вперёд или назад).

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

В большинстве случаев используйте DateTime.now/2 или DateTime.utc_now/1 вместо неё.

Не включает дробные секунды.

Примеры

iex> naive_datetime = NaiveDateTime.local_now()
iex> naive_datetime.year >= 2019
true

new(дата, время)Источник

@spec new(Date.t(), Time.t()) :: {:ok, t()}

Создаёт наивную дату и время из структур даты и времени.

Примеры

iex> NaiveDateTime.new(~D[2010-01-13], ~T[23:00:07.005])
{:ok, ~N[2010-01-13 23:00:07.005]}

new(год, месяц, день, час, минута, секунда, микросекунда \\ {0, 0}, календарь \\ Calendar.ISO)Источник

@spec new(
  Calendar.year(),
  Calendar.month(),
  Calendar.day(),
  Calendar.hour(),
  Calendar.minute(),
  Calendar.second(),
  Calendar.microsecond() | non_neg_integer(),
  Calendar.calendar()
) :: {:ok, t()} | {:error, atom()}

Создаёт новую наивную дату и время по ISO.

Ожидает, что все значения будут целыми числами. Возвращает {:ok, naive_datetime} если каждое значение входит в соответствующий диапазон, возвращает {:error, reason} в противном случае.

Примеры

iex> NaiveDateTime.new(2000, 1, 1, 0, 0, 0)
{:ok, ~N[2000-01-01 00:00:00]}
iex> NaiveDateTime.new(2000, 13, 1, 0, 0, 0)
{:error, :invalid_date}
iex> NaiveDateTime.new(2000, 2, 29, 0, 0, 0)
{:ok, ~N[2000-02-29 00:00:00]}
iex> NaiveDateTime.new(2000, 2, 30, 0, 0, 0)
{:error, :invalid_date}
iex> NaiveDateTime.new(2001, 2, 29, 0, 0, 0)
{:error, :invalid_date}

iex> NaiveDateTime.new(2000, 1, 1, 23, 59, 59, {0, 1})
{:ok, ~N[2000-01-01 23:59:59.0]}
iex> NaiveDateTime.new(2000, 1, 1, 23, 59, 59, 999_999)
{:ok, ~N[2000-01-01 23:59:59.999999]}
iex> NaiveDateTime.new(2000, 1, 1, 24, 59, 59, 999_999)
{:error, :invalid_time}
iex> NaiveDateTime.new(2000, 1, 1, 23, 60, 59, 999_999)
{:error, :invalid_time}
iex> NaiveDateTime.new(2000, 1, 1, 23, 59, 60, 999_999)
{:error, :invalid_time}
iex> NaiveDateTime.new(2000, 1, 1, 23, 59, 59, 1_000_000)
{:error, :invalid_time}

iex> NaiveDateTime.new(2000, 1, 1, 23, 59, 59, {0, 1}, Calendar.ISO)
{:ok, ~N[2000-01-01 23:59:59.0]}

new!(дата, время)Источник

@spec new!(Date.t(), Time.t()) :: t()

Создаёт наивную дату и время из структур даты и времени.

Примеры

iex> NaiveDateTime.new!(~D[2010-01-13], ~T[23:00:07.005])
~N[2010-01-13 23:00:07.005]

new!(год, месяц, день, час, минута, секунда, микросекунда \\ {0, 0}, календарь \\ Calendar.ISO)Источник

@spec new!(
  Calendar.year(),
  Calendar.month(),
  Calendar.day(),
  Calendar.hour(),
  Calendar.minute(),
  Calendar.second(),
  Calendar.microsecond() | non_neg_integer(),
  Calendar.calendar()
) :: t()

Создаёт новую наивную дату и время по ISO.

Ожидает, что все значения будут целыми числами. Возвращает naive_datetime если каждое значение входит в соответствующий диапазон, а если время или дата неверны, то генерирует исключение.

Примеры

iex> NaiveDateTime.new!(2000, 1, 1, 0, 0, 0)
~N[2000-01-01 00:00:00]
iex> NaiveDateTime.new!(2000, 2, 29, 0, 0, 0)
~N[2000-02-29 00:00:00]
iex> NaiveDateTime.new!(2000, 1, 1, 23, 59, 59, {0, 1})
~N[2000-01-01 23:59:59.0]
iex> NaiveDateTime.new!(2000, 1, 1, 23, 59, 59, 999_999)
~N[2000-01-01 23:59:59.999999]
iex> NaiveDateTime.new!(2000, 1, 1, 23, 59, 59, {0, 1}, Calendar.ISO)
~N[2000-01-01 23:59:59.0]
iex> NaiveDateTime.new!(2000, 1, 1, 24, 59, 59, 999_999)
** (ArgumentError) cannot build naive datetime, reason: :invalid_time

shift(наивная_дата_время, длительность)Источник

@spec shift(Calendar.naive_datetime(), Duration.duration()) :: t()

Смещает данную naive_datetime на duration в соответствии с её календарём.

Разрешенные единицы: :year, :month, :week, :day, :hour, :minute, :second, :microsecond.

При использовании по умолчанию календаря ISO длительности схлопываются и применяются в порядке месяцев, затем секунд и микросекунд:

  • при смещении на 1 год и 2 месяца дата фактически смещается на 14 месяцев
  • недели, дни и меньшие единицы схлопываются в секунды и микросекунды

При смещении на месяц дни округляются до ближайшей допустимой даты.

Примеры

iex> NaiveDateTime.shift(~N[2016-01-31 00:00:00], month: 1)
~N[2016-02-29 00:00:00]
iex> NaiveDateTime.shift(~N[2016-01-31 00:00:00], year: 4, day: 1)
~N[2020-02-01 00:00:00]
iex> NaiveDateTime.shift(~N[2016-01-31 00:00:00], year: -2, day: 1)
~N[2014-02-01 00:00:00]
iex> NaiveDateTime.shift(~N[2016-01-31 00:00:00], second: 45)
~N[2016-01-31 00:00:45]
iex> NaiveDateTime.shift(~N[2016-01-31 00:00:00], microsecond: {100, 6})
~N[2016-01-31 00:00:00.000100]

# leap years
iex> NaiveDateTime.shift(~N[2024-02-29 00:00:00], year: 1)
~N[2025-02-28 00:00:00]
iex> NaiveDateTime.shift(~N[2024-02-29 00:00:00], year: 4)
~N[2028-02-29 00:00:00]

# rounding down
iex> NaiveDateTime.shift(~N[2015-01-31 00:00:00], month: 1)
~N[2015-02-28 00:00:00]

to_date(массив)Источник

@spec to_date(Calendar.naive_datetime()) :: Date.t()

Преобразует NaiveDateTime в Date.

Так как Date не содержит информацию о времени, данные будут утеряны при преобразовании.

Примеры

iex> NaiveDateTime.to_date(~N[2002-01-13 23:00:07])
~D[2002-01-13]

to_erl(наивная_дата_время)Источник

@spec to_erl(Calendar.naive_datetime()) :: :calendar.datetime()

Преобразует структуру NaiveDateTime в кортеж Erlang datetime.

Поддерживает только преобразование наивных дат и времени в календаре ISO, попытка преобразования наивных дат и времени из других календарей приведёт к исключению.

ВНИМАНИЕ: Возможно потеря точности, так как кортежи времени Erlang хранят только час/минуту/секунду.

Примеры

iex> NaiveDateTime.to_erl(~N[2000-01-01 13:30:15])
{{2000, 1, 1}, {13, 30, 15}}

Эта функция также может использоваться для преобразования DateTime в кортеж Erlang datetime без информации о часовом поясе:

iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
...>                hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...>                utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
iex> NaiveDateTime.to_erl(dt)
{{2000, 2, 29}, {23, 00, 07}}

to_gregorian_seconds(массив)Источник

@spec to_gregorian_seconds(Calendar.naive_datetime()) ::
  {integer(), non_neg_integer()}

Преобразует структуру NaiveDateTime в количество секунд и микросекунд по григорианскому календарю.

Примеры

iex> NaiveDateTime.to_gregorian_seconds(~N[0000-01-01 00:00:01])
{1, 0}
iex> NaiveDateTime.to_gregorian_seconds(~N[2020-05-01 00:26:31.005])
{63_755_511_991, 5000}

to_iso8601(наивная_дата_время, формат \\ :extended)Источник

@spec to_iso8601(Calendar.naive_datetime(), :basic | :extended) :: String.t()

Преобразует заданную наивную дату и время в формат ISO 8601:2019.

По умолчанию, NaiveDateTime.to_iso8601/2 возвращает наивные даты и время в формате «расширенном» для удобства чтения человеком. Также поддерживается формат «базовый» через опцию :basic.

Поддерживает только преобразование наивных дат и времени в календаре ISO, попытка преобразования наивных дат и времени из других календарей приведёт к исключению.

Примеры

iex> NaiveDateTime.to_iso8601(~N[2000-02-28 23:00:13])
"2000-02-28T23:00:13"

iex> NaiveDateTime.to_iso8601(~N[2000-02-28 23:00:13.001])
"2000-02-28T23:00:13.001"

iex> NaiveDateTime.to_iso8601(~N[2000-02-28 23:00:13.001], :basic)
"20000228T230013.001"

Эта функция также может использоваться для преобразования DateTime в ISO 8601 без информации о часовом поясе:

iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
...>                hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...>                utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
iex> NaiveDateTime.to_iso8601(dt)
"2000-02-29T23:00:07"

to_string(наивная_дата_время)Источник

@spec to_string(Calendar.naive_datetime()) :: String.t()

Преобразует данную наивную дату и время в строку в соответствии с её календарём.

Примеры

iex> NaiveDateTime.to_string(~N[2000-02-28 23:00:13])
"2000-02-28 23:00:13"
iex> NaiveDateTime.to_string(~N[2000-02-28 23:00:13.001])
"2000-02-28 23:00:13.001"
iex> NaiveDateTime.to_string(~N[-0100-12-15 03:20:31])
"-0100-12-15 03:20:31"

Эта функция также может использоваться для преобразования DateTime в строку без информации о часовом поясе:

iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
...>                hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...>                utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
iex> NaiveDateTime.to_string(dt)
"2000-02-29 23:00:07"

to_time(массив)Источник

@spec to_time(Calendar.naive_datetime()) :: Time.t()

Преобразует NaiveDateTime в Time.

Так как Time не содержит информацию о дате, данные будут утеряны при преобразовании.

Примеры

iex> NaiveDateTime.to_time(~N[2002-01-13 23:00:07])
~T[23:00:07]

truncate(naive_datetime, precision)Source

@spec truncate(t(), :microsecond | :millisecond | :second) :: t()

Возвращает заданную простую дату и время с микросекундным значением, усечённым до заданной точности (:microsecond, :millisecond или :second).

Заданная простая дата и время возвращается без изменений, если она уже имеет меньшую точность, чем заданная точность.

Примеры

iex> NaiveDateTime.truncate(~N[2017-11-06 00:23:51.123456], :microsecond)
~N[2017-11-06 00:23:51.123456]

iex> NaiveDateTime.truncate(~N[2017-11-06 00:23:51.123456], :millisecond)
~N[2017-11-06 00:23:51.123]

iex> NaiveDateTime.truncate(~N[2017-11-06 00:23:51.123456], :second)
~N[2017-11-06 00:23:51]

utc_now(calendar_or_time_unit \\ Calendar.ISO)Source

@spec utc_now(Calendar.calendar() | :native | :microsecond | :millisecond | :second) ::
  t()

Возвращает текущую простую дату и время в UTC.

Предпочтительно использовать DateTime.utc_now/0 по возможности, так как, в отличие от NaiveDateTime, она сохраняет информацию о часовом поясе.

Вы также можете указать единицу измерения времени, чтобы автоматически усечь простую дату и время. Это доступно начиная с версии v1.15.0.

Примеры

iex> naive_datetime = NaiveDateTime.utc_now()
iex> naive_datetime.year >= 2016
true

iex> naive_datetime = NaiveDateTime.utc_now(:second)
iex> naive_datetime.microsecond
{0, 0}

utc_now(time_unit, calendar)Source

@spec utc_now(:native | :microsecond | :millisecond | :second, Calendar.calendar()) ::
  t()

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

Предпочтительно использовать DateTime.utc_now/2 по возможности, так как, в отличие от NaiveDateTime, она сохраняет информацию о часовом поясе.

Примеры

iex> naive_datetime = NaiveDateTime.utc_now(:second, Calendar.ISO)
iex> naive_datetime.year >= 2016
true

iex> naive_datetime = NaiveDateTime.utc_now(:second, Calendar.ISO)
iex> naive_datetime.microsecond
{0, 0}

Скачать версию ePub

Создано с помощью ExDoc (v0.34.1) для языка программирования Elixir

© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.17.2/NaiveDateTime.html

Spec-Zone.ru

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