NaiveDateTime
Структура NaiveDateTime (без часового пояса) и функции.
Структура NaiveDateTime содержит поля год, месяц, день, час, минута, секунда, микросекунда и календарь. Новые значения дат и времени можно создать с помощью функций new/2 и new/7 или используя сигил ~N.
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, а также с любыми структурами, которые содержат те же поля, что и структура NaiveDateTime, такие как DateTime. Такие функции ожидают Calendar.naive_datetime/0 в своих типовреках (вместо t/0).
Разработчики должны избегать непосредственного создания структур NaiveDateTime и вместо этого полагаться на функции, предоставляемые этим модулем, а также на функции библиотек календарей сторонних разработчиков.
Сравнение наивных дат и времени
Сравнения в Elixir, используя ==, >, < и аналогичные, являются структурными и основаны на полях структуры NaiveDateTime. Для корректного сравнения наивных дат и времени используйте функцию compare/2.
Использование эпох
Функции 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], 1271512800) ~N[2010-04-17 14:00:00]
Эти функции оптимизированы для работы с распространёнными эпохами, такими как эпоха Unix или эпоха Григорианского календаря (0000-01-01 00:00:00).
Резюме
Типы
- t()
Функции
- add(naive_datetime, integer, unit \\ :second)
-
Добавляет указанное количество времени к
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 - from_erl(tuple, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)
-
Преобразует кортеж Erlang даты и времени в структуру
NaiveDateTime - from_erl!(tuple, microsecond \\ {0, 0})
-
Преобразует кортеж Erlang даты и времени в структуру
NaiveDateTime - from_iso8601(string, calendar \\ Calendar.ISO)
-
Парсит расширенный формат «Дата и время суток», описанный в ISO 8601:2004
- from_iso8601!(string, calendar \\ Calendar.ISO)
-
Парсит расширенный формат «Дата и время суток», описанный в ISO 8601:2004
- new(date, time)
-
Создаёт наивное значение даты и времени из структур даты и времени
- new(year, month, day, hour, minute, second, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)
-
Создаёт новую наивную дату и время в формате ISO
- to_date(naive_date_time)
-
Преобразует
NaiveDateTimeвDate - to_erl(naive_datetime)
-
Преобразует структуру
NaiveDateTimeв кортеж Erlang даты и времени - to_iso8601(naive_datetime, format \\ :extended)
-
Преобразует заданную наивную дату и время в формат ISO 8601:2004
- to_string(naive_datetime)
-
Преобразует заданную наивную дату и время в строку в соответствии с её календарём
- to_time(naive_date_time)
-
Преобразует
NaiveDateTimeвTime - utc_now(calendar \\ Calendar.ISO)
-
Возвращает текущую наивную дату и время в 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. Отрицательные значения перемещают во времени назад.
Эта операция возможна только в том случае, если оба календаря преобразуются в 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]
# 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 convert(naive_datetime, calendar)
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)
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)
diff(t(), t(), System.time_unit()) :: integer()
Вычитает naive_datetime2 из naive_datetime1.
Ответ может быть возвращён в любом unit доступном из System.time_unit/0.
Функция возвращает разницу в секундах, где секунды измеряются согласно Calendar.ISO.
Примеры
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 iex> NaiveDateTime.diff(~N[2014-10-02 00:29:10], ~N[2014-10-02 00:29:12]) -2 # to Gregorian seconds iex> NaiveDateTime.diff(~N[2014-10-02 00:29:10], ~N[0000-01-01 00:00:00]) 63579428950
from_erl(tuple, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)
Преобразует кортеж Erlang даты и времени в структуру 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 даты и времени в структуру NaiveDateTime.
Вызывает исключение, если дата и время некорректны. Попытка преобразовать некорректную дату календаря 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(string, calendar \\ Calendar.ISO)
from_iso8601(String.t(), Calendar.calendar()) ::
{:ok, t()} |
{:error, atom()} Парсит расширенный формат «Дата и время суток», описанный в ISO 8601:2004.
Смещение часового пояса может быть включено в строку, но оно будет просто проигнорировано, так как такая информация не включена в наивные даты и время.
Как указано в стандарте, разделитель «T» может быть опущен по желанию, так как в этой функции нет неоднозначностей.
Не поддерживаются представления времени с уменьшенной точностью.
Обратите внимание, что, хотя ISO8601 допускает указание дат и времени 24:00:00 как нулевого часа следующего дня, эта запись не поддерживается в Elixir.
Примеры
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!(string, calendar \\ Calendar.ISO)
from_iso8601!(String.t(), Calendar.calendar()) :: 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-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()} Создаёт простую дату и время из структур 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}, calendar \\ Calendar.ISO)
new(Calendar.year(), Calendar.month(), Calendar.day(), Calendar.hour(), Calendar.minute(), Calendar.second(), Calendar.microsecond(), 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, 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(naive_datetime)
to_erl(t()) :: :calendar.datetime()
to_erl(Calendar.time()) :: :calendar.time()
Преобразует структуру NaiveDateTime в кортеж Erlang для даты и времени.
Поддерживает преобразование только простых дат и времени по ISO календарю. Попытка преобразования простых дат и времени из других календарей приведёт к исключению.
ВНИМАНИЕ: Возможно потеря точности, так как кортежи Erlang для времени хранят только часы/минуты/секунды.
Примеры
iex> NaiveDateTime.to_erl(~N[2000-01-01 13:30:15])
{{2000, 1, 1}, {13, 30, 15}} Эта функция также может использоваться для преобразования DateTime в формат Erlang без информации о часовом поясе:
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(naive_datetime, format \\ :extended)
to_iso8601(Calendar.naive_datetime(), :basic | :extended) :: String.t()
Преобразует заданную простую дату и время в ISO 8601:2004.
По умолчанию, NaiveDateTime.to_iso8601/2 возвращает простые даты и время в формате «extended» для удобства чтения человеком. Также поддерживается формат «basic» при передаче :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 в 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(naive_datetime)
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"
Эта функция также может использоваться для преобразования 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(calendar \\ Calendar.ISO)
utc_now(Calendar.calendar()) :: t()
Возвращает текущую простую дату и время в 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.5.3/NaiveDateTime.html