Spec-Zone.ru › Elixir 1.4

NaiveDateTime

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

Структура NaiveDateTime содержит поля year, month, day, hour, minute, second, microsecond и calendar. Новые значения naive datetime можно создать с помощью функции new/7 или используя сигил ~N:

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

Оба new/7 и сигил возвращают структуру, где к полям даты можно получить доступ напрямую:

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

Пометка «naive» означает, что данное представление даты и времени не имеет часового пояса. Это означает, что время может фактически не существовать в некоторых частях мира, даже если оно является корректным.

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

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

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

Типы

t()

Функции

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

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

compare(naive_datetime1, naive_datetime2)

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

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

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

from_erl(arg, microsecond \\ {0, 0})

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

from_erl!(tuple, microsecond \\ {0, 0})

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

from_iso8601(arg)

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

from_iso8601!(string)

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

new(date, time)

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

new(year, month, day, hour, minute, second, microsecond \\ {0, 0})

Создаёт новую ISO naive datetime

to_date(naive_date_time)

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

to_erl(map)

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

to_iso8601(map)

Преобразует данную naive datetime в ISO 8601:2004

to_string(map)

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

to_time(naive_date_time)

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

utc_now()

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

Типы

t()

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()}

Функции

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

add(t(), integer(), System.time_unit()) :: t()

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

Принимает значение integer в любом unit доступном из System.time_unit/0. Отрицательные значения будут сдвигать время назад.

Примеры

# 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]
# can work with other units
iex> NaiveDateTime.add(~N[2014-10-02 00:29:10], 2_000, :millisecond)
~N[2014-10-02 00:29:12]
# keeps the same precision
iex> NaiveDateTime.add(~N[2014-10-02 00:29:10.021], 21, :second)
~N[2014-10-02 00:29:31.021]
# changes below the precision will not be visible
iex> hidden = NaiveDateTime.add(~N[2014-10-02 00:29:10], 21, :millisecond)
iex> hidden.microsecond  # ~N[2014-10-02 00:29:10]
{21000, 0}
# from gregorian seconds
iex> NaiveDateTime.add(~N[0000-01-01 00:00:00], 63579428950)
~N[2014-10-02 00:29:10]

compare(naive_datetime1, naive_datetime2)

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

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

diff(t(), t(), System.time_unit()) :: integer()

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

Результат может быть возвращён в любом unit доступном из System.time_unit/0.

Примеры

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], :millisecond)
21
# to gregorian seconds
iex> NaiveDateTime.diff(~N[2014-10-02 00:29:10], ~N[0000-01-01 00:00:00])
63579428950

from_erl(arg, microsecond \\ {0, 0})

from_erl(:calendar.datetime(), Calendar.microsecond()) ::
  {: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})

from_erl!(:calendar.datetime(), Calendar.microsecond()) ::
  t() |
  no_return()

Преобразует кортеж 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_iso8601(arg)

from_iso8601(String.t()) :: {:ok, t()} | {:error, atom()}

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

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

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

Представления времени с уменьшенной точностью не поддерживаются.

Примеры

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-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!(string)

from_iso8601!(String.t()) :: t() | no_return()

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

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

Примеры

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

new(date, time)

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

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

Примеры

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

new(year, month, day, hour, minute, second, microsecond \\ {0, 0})

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

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

Ожидаются все значения в виде целых чисел. Возвращает {: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, 23, 59, 60, 999_999)
{:ok, ~N[2000-01-01 23:59:60.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, 61, 999_999)
{:error, :invalid_time}
iex> NaiveDateTime.new(2000, 1, 1, 23, 59, 59, 1_000_000)
{:error, :invalid_time}

to_date(naive_date_time)

to_date(t()) :: Date.t()

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

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

Примеры

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

to_erl(map)

to_erl(t()) :: :calendar.datetime()

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

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

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

Примеры

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

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

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_iso8601(map)

to_iso8601(Calendar.naive_datetime()) :: String.t()

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

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

Примеры

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"

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

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(map)

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

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

Примеры

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"

Эта функция также может использоваться для преобразования 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(naive_date_time)

to_time(t()) :: Time.t()

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

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

Примеры

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

utc_now()

utc_now() :: t()

Возвращает текущее простое значение datetime в UTC.

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

Примеры

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

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.4.5/NaiveDateTime.html

Spec-Zone.ru

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