DateTime
Реализация DateTime с часовым поясом.
Данное значение DateTime можно рассматривать как мгновенный снимок даты и времени в заданном часовом поясе. Для этих целей оно также включает в себя UTC-смещение и стандартное смещение, а также поле сокращения зоны, используемое исключительно для форматирования.
Помните, что сравнения в Elixir с помощью ==/2, >/2, </2 и подобных функций являются структурными и основаны на полях структуры DateTime. Для правильного сравнения DateTime используйте функцию compare/2.
Разработчики должны избегать непосредственного создания структуры DateTime и вместо этого полагаться на функции, предоставляемые этим модулем, а также функциями сторонних библиотек календаря.
База данных часовых поясов
Многие функции в этом модуле требуют базу данных часовых поясов. По умолчанию используется база данных часовых поясов по умолчанию, возвращаемая функцией Calendar.get_time_zone_database/0, которая по умолчанию устанавливает Calendar.UTCOnlyTimeZoneDatabase, обрабатывающую только даты и время "Etc/UTC" и возвращающую {:error, :utc_only_time_zone_database} для любого другого часового пояса.
Другие базы данных часовых поясов (включая те, которые предоставляются пакетами) могут быть настроены как по умолчанию, либо через конфигурацию:
config :elixir, :time_zone_database, CustomTimeZoneDatabase
или вызывая Calendar.put_time_zone_database/1.
Резюме
Типы
- t()
Функции
- add(datetime, amount_to_add, unit \\ :second, time_zone_database \\ Calendar.get_time_zone_database())
Добавляет заданное количество времени к
DateTime.- compare(datetime1, datetime2)
Сравнивает две структуры datetime.
- convert(datetime, calendar)
Преобразует данное
datetimeиз одного календаря в другой.- convert!(datetime, calendar)
Преобразует данное
datetimeиз одного календаря в другой.- diff(datetime1, datetime2, unit \\ :second)
Вычитает
datetime2изdatetime1.- from_iso8601(string, calendar \\ Calendar.ISO)
Разбирает расширенный формат "Дата и время" описанный в ISO 8601:2004.
- from_naive(naive_datetime, time_zone, time_zone_database \\ Calendar.get_time_zone_database())
Преобразует заданную
NaiveDateTimeвDateTime.- from_naive!(naive_datetime, time_zone, time_zone_database \\ Calendar.get_time_zone_database())
Преобразует заданную
NaiveDateTimeвDateTime.- from_unix(integer, unit \\ :second, calendar \\ Calendar.ISO)
Преобразует заданное Unix-время в
DateTime.- from_unix!(integer, unit \\ :second, calendar \\ Calendar.ISO)
Преобразует заданное Unix-время в
DateTime.- now(time_zone, time_zone_database \\ Calendar.get_time_zone_database())
Возвращает текущую дату и время в заданном часовом поясе.
- shift_zone(datetime, time_zone, time_zone_database \\ Calendar.get_time_zone_database())
Изменяет часовой пояс
DateTime.- to_date(datetime)
- to_iso8601(datetime, format \\ :extended)
Преобразует заданную дату и время в формат ISO 8601:2004.
- to_naive(datetime)
Преобразует заданное
datetimeвNaiveDateTime.- to_string(datetime)
Преобразует заданное
datetimeв строку в соответствии с его календарем.- to_time(datetime)
- to_unix(datetime, unit \\ :second)
Преобразует заданное
datetimeв Unix-время.- truncate(datetime, precision)
Возвращает заданную дату и время с усечённой микросекундами до заданной точности (
:microsecond,millisecondили:second).- utc_now(calendar \\ Calendar.ISO)
Возвращает текущее время в UTC.
Типы
t()
t() :: %DateTime{
calendar: Calendar.calendar(),
day: Calendar.day(),
hour: Calendar.hour(),
microsecond: Calendar.microsecond(),
minute: Calendar.minute(),
month: Calendar.month(),
second: Calendar.second(),
std_offset: Calendar.std_offset(),
time_zone: Calendar.time_zone(),
utc_offset: Calendar.utc_offset(),
year: Calendar.year(),
zone_abbr: Calendar.zone_abbr()
} Функции
add(datetime, amount_to_add, unit \\ :second, time_zone_database \\ Calendar.get_time_zone_database())
(since 1.8.0)add( Calendar.datetime(), integer(), System.time_unit(), Calendar.time_zone_database() ) :: t()
Добавляет заданное количество времени к DateTime.
Принимает значение amount_to_add в любом unit доступном из System.time_unit/0. Отрицательные значения будут перемещать во времени назад.
Учитывает изменения, такие как летнее/зимнее время (DST). Это означает, что добавление времени может привести к "обратному ходу" времени при "переходе на зимнее время" осенью. Добавление всего нескольких секунд к значению datetime непосредственно перед "переходом на летнее время" может привести к увеличению времени на более чем час.
Точность дробных секунд остается неизменной, аналогично NaiveDateTime.add/2.
Примеры
iex> dt = DateTime.from_naive!(~N[2018-11-15 10:00:00], "Europe/Copenhagen", FakeTimeZoneDatabase) iex> dt |> DateTime.add(3600, :second, FakeTimeZoneDatabase) #DateTime<2018-11-15 11:00:00+01:00 CET Europe/Copenhagen> iex> dt = DateTime.from_naive!(~N[2018-11-15 10:00:00], "Etc/UTC") iex> dt |> DateTime.add(3600, :second) #DateTime<2018-11-15 11:00:00Z>
При добавлении 3 секунд непосредственно перед "переходом на летнее время" мы переходим от 1:59:59 до 3:00:02
iex> dt = DateTime.from_naive!(~N[2019-03-31 01:59:59.123], "Europe/Copenhagen", FakeTimeZoneDatabase) iex> dt |> DateTime.add(3, :second, FakeTimeZoneDatabase) #DateTime<2019-03-31 03:00:02.123+02:00 CEST Europe/Copenhagen>
compare(datetime1, datetime2)
(since 1.4.0)compare(Calendar.datetime(), Calendar.datetime()) :: :lt | :eq | :gt
Сравнивает две структуры datetime.
Возвращает :gt если первая дата и время позже, чем вторая и :lt для обратного случая. Если две даты и время равны, возвращается :eq.
Обратите внимание, что при сравнении учитываются как UTC, так и стандартные смещения.
Примеры
iex> dt1 = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "AMT",
...> hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...> utc_offset: -14400, std_offset: 0, time_zone: "America/Manaus"}
iex> dt2 = %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> DateTime.compare(dt1, dt2)
:gt convert(datetime, calendar)
(since 1.5.0)convert(Calendar.datetime(), Calendar.calendar()) ::
{:ok, t()} | {:error, :incompatible_calendars} Преобразует данное datetime из одного календаря в другой.
Если невозможна однозначная конвертация между календарями (см. Calendar.compatible_calendars?/2), возвращается кортеж {:error, :incompatible_calendars}.
Примеры
Представьте, что кто-то реализовал Calendar.Holocene, календарь, основанный на григорианском календаре, который добавляет ровно 10 000 лет к текущему григорианскому году:
iex> dt1 = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "AMT",
...> hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...> utc_offset: -14400, std_offset: 0, time_zone: "America/Manaus"}
iex> DateTime.convert(dt1, Calendar.Holocene)
{:ok, %DateTime{calendar: Calendar.Holocene, day: 29, hour: 23,
microsecond: {0, 0}, minute: 0, month: 2, second: 7, std_offset: 0,
time_zone: "America/Manaus", utc_offset: -14400, year: 12000,
zone_abbr: "AMT"}} convert!(datetime, calendar)
(since 1.5.0)convert!(Calendar.datetime(), Calendar.calendar()) :: t()
Преобразует данное datetime из одного календаря в другой.
Если невозможна однозначная конвертация между календарями (см. Calendar.compatible_calendars?/2), возникает исключение ArgumentError.
Примеры
Представьте, что кто-то реализовал Calendar.Holocene, календарь, основанный на григорианском календаре, который добавляет ровно 10 000 лет к текущему григорианскому году:
iex> dt1 = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "AMT",
...> hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...> utc_offset: -14400, std_offset: 0, time_zone: "America/Manaus"}
iex> DateTime.convert!(dt1, Calendar.Holocene)
%DateTime{calendar: Calendar.Holocene, day: 29, hour: 23,
microsecond: {0, 0}, minute: 0, month: 2, second: 7, std_offset: 0,
time_zone: "America/Manaus", utc_offset: -14400, year: 12000,
zone_abbr: "AMT"} diff(datetime1, datetime2, unit \\ :second)
(since 1.5.0)diff(Calendar.datetime(), Calendar.datetime(), System.time_unit()) :: integer()
Вычитает datetime2 из datetime1.
Результат может быть возвращен в любом unit доступном из System.time_unit/0.
Высокоскоростные секунды не учитываются.
Эта функция возвращает разницу во времени в секундах, где секунды измеряются в соответствии с Calendar.ISO.
Примеры
iex> dt1 = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "AMT",
...> hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...> utc_offset: -14400, std_offset: 0, time_zone: "America/Manaus"}
iex> dt2 = %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> DateTime.diff(dt1, dt2)
18000
iex> DateTime.diff(dt2, dt1)
-18000 from_iso8601(string, calendar \\ Calendar.ISO)
(since 1.4.0)from_iso8601(String.t(), Calendar.calendar()) ::
{:ok, t(), Calendar.utc_offset()} | {:error, atom()} Разбирает расширенный формат "Дата и время" описанный в ISO 8601:2004.
Так как ISO 8601 не включает в себя соответствующий часовой пояс, заданная строка будет преобразована в UTC, а ее смещение во времени в секундах будет возвращено в качестве части этой функции. Поэтому информация о смещении должна быть присутствовать в строке.
Как указано в стандарте, разделитель "T" может быть опущен по желанию, так как это не приводит к неоднозначности в данной функции.
Год, разбираемый этой функцией, ограничен четырьмя цифрами, и, хотя ISO 8601 допускает указание времени 24:00:00 как нулевого часа следующего дня, эта запись не поддерживается Elixir. Высокоскоростные секунды не поддерживаются встроенным календарем Calendar.ISO.
Примеры
iex> {:ok, datetime, 0} = DateTime.from_iso8601("2015-01-23T23:50:07Z")
iex> datetime
#DateTime<2015-01-23 23:50:07Z>
iex> {:ok, datetime, 9000} = DateTime.from_iso8601("2015-01-23T23:50:07.123+02:30")
iex> datetime
#DateTime<2015-01-23 21:20:07.123Z>
iex> {:ok, datetime, 9000} = DateTime.from_iso8601("2015-01-23T23:50:07,123+02:30")
iex> datetime
#DateTime<2015-01-23 21:20:07.123Z>
iex> {:ok, datetime, 0} = DateTime.from_iso8601("-2015-01-23T23:50:07Z")
iex> datetime
#DateTime<-2015-01-23 23:50:07Z>
iex> {:ok, datetime, 9000} = DateTime.from_iso8601("-2015-01-23T23:50:07,123+02:30")
iex> datetime
#DateTime<-2015-01-23 21:20:07.123Z>
iex> DateTime.from_iso8601("2015-01-23P23:50:07")
{:error, :invalid_format}
iex> DateTime.from_iso8601("2015-01-23T23:50:07")
{:error, :missing_offset}
iex> DateTime.from_iso8601("2015-01-23 23:50:61")
{:error, :invalid_time}
iex> DateTime.from_iso8601("2015-01-32 23:50:07")
{:error, :invalid_date}
iex> DateTime.from_iso8601("2015-01-23T23:50:07.123-00:00")
{:error, :invalid_format} from_naive(naive_datetime, time_zone, time_zone_database \\ Calendar.get_time_zone_database())
(since 1.4.0)from_naive(
Calendar.naive_datetime(),
Calendar.time_zone(),
Calendar.time_zone_database()
) ::
{:ok, t()}
| {:ambiguous, t(), t()}
| {:gap, t(), t()}
| {:error,
:incompatible_calendars
| :time_zone_not_found
| :utc_only_time_zone_database} Преобразует заданную NaiveDateTime в DateTime.
Ожидается часовой пояс, чтобы поместить NaiveDateTime в него. Если часовой пояс — "Etc/UTC", функция всегда выполняется успешно. В противном случае NaiveDateTime проверяется по базе данных часовых поясов, переданной в виде time_zone_database. См. раздел «База данных часовых поясов» в документации модуля.
Примеры
iex> {:ok, datetime} = DateTime.from_naive(~N[2016-05-24 13:26:08.003], "Etc/UTC")
iex> datetime
#DateTime<2016-05-24 13:26:08.003Z> Когда дата и время являются неоднозначными — например, при переходе с летнего на зимнее время — возвращаются оба возможных допустимых значения даты и времени. Сначала то, которое происходит раньше, затем то, которое происходит позже.
iex> {:ambiguous, first_dt, second_dt} = DateTime.from_naive(~N[2018-10-28 02:30:00], "Europe/Copenhagen", FakeTimeZoneDatabase)
iex> first_dt
#DateTime<2018-10-28 02:30:00+02:00 CEST Europe/Copenhagen>
iex> second_dt
#DateTime<2018-10-28 02:30:00+01:00 CET Europe/Copenhagen> Когда в реальном времени есть разрыв — например, весной, когда переводим часы вперёд — возвращается последнее допустимое значение даты и времени непосредственно перед разрывом и первое допустимое значение даты и времени сразу после разрыва.
iex> {:gap, just_before, just_after} = DateTime.from_naive(~N[2019-03-31 02:30:00], "Europe/Copenhagen", FakeTimeZoneDatabase)
iex> just_before
#DateTime<2019-03-31 01:59:59.999999+01:00 CET Europe/Copenhagen>
iex> just_after
#DateTime<2019-03-31 03:00:00+02:00 CEST Europe/Copenhagen> Большинство раз есть одно и только одно допустимое значение даты и времени для определенной даты, времени и часового пояса.
iex> {:ok, datetime} = DateTime.from_naive(~N[2018-07-28 12:30:00], "Europe/Copenhagen", FakeTimeZoneDatabase)
iex> datetime
#DateTime<2018-07-28 12:30:00+02:00 CEST Europe/Copenhagen> Эта функция принимает любой массив или структуру, содержащую по крайней мере те же поля, что и структура NaiveDateTime. Наиболее распространённым примером является DateTime. В этом случае информация о часовом поясе этого DateTime игнорируется полностью. Это тот же принцип, что и передача DateTime функции Date.to_iso8601/2. Date.to_iso8601/2 извлекает только поля, относящиеся к дате (календарь, год, месяц и день) из заданной структуры и игнорирует все остальные.
Таким образом, если у вас есть DateTime в одном часовом поясе, вы можете получить то же реальное время в другом часовом поясе. Например, если у вас 2018-08-24 10:00:00 по копенгагенскому времени, и вам нужен DateTime для 2018-08-24 10:00:00 по UTC, можно сделать следующее:
iex> cph_datetime = DateTime.from_naive!(~N[2018-08-24 10:00:00], "Europe/Copenhagen", FakeTimeZoneDatabase)
iex> {:ok, utc_datetime} = DateTime.from_naive(cph_datetime, "Etc/UTC", FakeTimeZoneDatabase)
iex> utc_datetime
#DateTime<2018-08-24 10:00:00Z> Если вместо этого вам нужен DateTime для той же точки времени в другом часовом поясе, см. функцию DateTime.shift_zone/3, которая преобразует 2018-08-24 10:00:00 по копенгагенскому времени в 2018-08-24 08:00:00 по UTC.
from_naive!(naive_datetime, time_zone, time_zone_database \\ Calendar.get_time_zone_database())
(с версии 1.4.0)from_naive!( NaiveDateTime.t(), Calendar.time_zone(), Calendar.time_zone_database() ) :: t()
Преобразует заданную NaiveDateTime в DateTime.
Ожидается часовой пояс, чтобы поместить NaiveDateTime в него. Если часовой пояс — "Etc/UTC", функция всегда выполняется успешно. В противном случае NaiveDateTime проверяется по базе данных часовых поясов, переданной в виде time_zone_database. См. раздел «База данных часовых поясов» в документации модуля.
Примеры
iex> DateTime.from_naive!(~N[2016-05-24 13:26:08.003], "Etc/UTC") #DateTime<2016-05-24 13:26:08.003Z> iex> DateTime.from_naive!(~N[2018-05-24 13:26:08.003], "Europe/Copenhagen", FakeTimeZoneDatabase) #DateTime<2018-05-24 13:26:08.003+02:00 CEST Europe/Copenhagen>
from_unix(integer, unit \\ :second, calendar \\ Calendar.ISO)
from_unix(integer(), :native | System.time_unit(), Calendar.calendar()) ::
{:ok, t()} | {:error, atom()} Преобразует заданное время Unix в DateTime.
Целое число может быть задано в разных единицах измерения в соответствии с System.convert_time_unit/3, и оно будет преобразовано во внутренние микросекунды.
Время Unix всегда в UTC, поэтому DateTime будет возвращено в UTC.
Примеры
iex> {:ok, datetime} = DateTime.from_unix(1_464_096_368)
iex> datetime
#DateTime<2016-05-24 13:26:08Z>
iex> {:ok, datetime} = DateTime.from_unix(1_432_560_368_868_569, :microsecond)
iex> datetime
#DateTime<2015-05-25 13:26:08.868569Z> Единица измерения также может быть целым числом, как в System.time_unit/0:
iex> {:ok, datetime} = DateTime.from_unix(143_256_036_886_856, 1024)
iex> datetime
#DateTime<6403-03-17 07:05:22.320Z> Отрицательные значения времени Unix поддерживаются до -62167219200 секунд, что эквивалентно "0000-01-01T00:00:00Z" или 0 григорианским секундам.
from_unix!(integer, unit \\ :second, calendar \\ Calendar.ISO)
from_unix!(integer(), :native | System.time_unit(), Calendar.calendar()) :: t()
Преобразует заданное время Unix в DateTime.
Целое число может быть задано в разных единицах измерения в соответствии с System.convert_time_unit/3, и оно будет преобразовано во внутренние микросекунды.
Время Unix всегда в UTC, поэтому DateTime будет возвращено в UTC.
Примеры
# An easy way to get the Unix epoch is passing 0 to this function iex> DateTime.from_unix!(0) #DateTime<1970-01-01 00:00:00Z> iex> DateTime.from_unix!(1_464_096_368) #DateTime<2016-05-24 13:26:08Z> iex> DateTime.from_unix!(1_432_560_368_868_569, :microsecond) #DateTime<2015-05-25 13:26:08.868569Z>
now(time_zone, time_zone_database \\ Calendar.get_time_zone_database())
(с версии 1.8.0)now(Calendar.time_zone(), Calendar.time_zone_database()) ::
{:ok, t()} | {:error, :time_zone_not_found | :utc_only_time_zone_database} Возвращает текущую дату и время в заданном часовом поясе.
По умолчанию используется значение часового пояса, возвращаемое Calendar.get_time_zone_database/0, по умолчанию Calendar.UTCOnlyTimeZoneDatabase, которое обрабатывает только datetime "Etc/UTC". Другие базы данных часовых поясов могут передаваться в качестве аргумента или устанавливаться глобально. См. раздел «База данных часовых поясов» в документации модуля.
Примеры
iex> {:ok, datetime} = DateTime.now("Etc/UTC")
iex> datetime.time_zone
"Etc/UTC"
iex> DateTime.now("Europe/Copenhagen")
{:error, :utc_only_time_zone_database}
iex> DateTime.now("not a real time zone name", FakeTimeZoneDatabase)
{:error, :time_zone_not_found} shift_zone(datetime, time_zone, time_zone_database \\ Calendar.get_time_zone_database())
(с версии 1.8.0)shift_zone(t(), Calendar.time_zone(), Calendar.time_zone_database()) ::
{:ok, t()} | {:error, :time_zone_not_found | :utc_only_time_zone_database} Изменяет часовой пояс DateTime.
Возвращает DateTime для той же точки времени, но в указанном часовом поясе. Предполагается, что DateTime является допустимым и существует в заданном часовом поясе и календаре.
По умолчанию используется база данных часовых поясов по умолчанию, возвращаемая Calendar.get_time_zone_database/0, по умолчанию Calendar.UTCOnlyTimeZoneDatabase, которая обрабатывает только datetime "Etc/UTC". Другие базы данных часовых поясов могут передаваться в качестве аргумента или устанавливаться глобально. См. раздел «База данных часовых поясов» в документации модуля.
Примеры
iex> cph_datetime = DateTime.from_naive!(~N[2018-07-16 12:00:00], "Europe/Copenhagen", FakeTimeZoneDatabase)
iex> {:ok, pacific_datetime} = DateTime.shift_zone(cph_datetime, "America/Los_Angeles", FakeTimeZoneDatabase)
iex> pacific_datetime
#DateTime<2018-07-16 03:00:00-07:00 PDT America/Los_Angeles> to_date(datetime)
to_date(Calendar.datetime()) :: Date.t()
Поскольку Date не содержит время и часовой пояс, данные будут потеряны при преобразовании.
Примеры
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> DateTime.to_date(dt)
~D[2000-02-29] to_iso8601(datetime, format \\ :extended)
to_iso8601(Calendar.datetime(), :extended | :basic) :: String.t()
Преобразует заданную дату и время в формат ISO 8601:2004.
По умолчанию DateTime.to_iso8601/2 возвращает дату и время в формате «расширенном» для удобочитаемости. Также поддерживается формат «базовый» через передачу параметра :basic.
Поддерживает преобразование только datetimes из ISO календаря. Попытка преобразования datetimes из других календарей приведёт к ошибке.
ПРЕДУПРЕЖДЕНИЕ: формат даты и времени 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> DateTime.to_iso8601(dt)
"2000-02-29T23:00:07+01:00"
iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "UTC",
...> hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...> utc_offset: 0, std_offset: 0, time_zone: "Etc/UTC"}
iex> DateTime.to_iso8601(dt)
"2000-02-29T23:00:07Z"
iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "AMT",
...> hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...> utc_offset: -14400, std_offset: 0, time_zone: "America/Manaus"}
iex> DateTime.to_iso8601(dt, :extended)
"2000-02-29T23:00:07-04:00"
iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "AMT",
...> hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...> utc_offset: -14400, std_offset: 0, time_zone: "America/Manaus"}
iex> DateTime.to_iso8601(dt, :basic)
"20000229T230007-0400" to_naive(datetime)
to_naive(Calendar.datetime()) :: NaiveDateTime.t()
Преобразует данную datetime в NaiveDateTime.
Так как NaiveDateTime не содержит информации о часовом поясе, любая информация, связанная с часовым поясом, будет потеряна при преобразовании.
Примеры
iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
...> hour: 23, minute: 0, second: 7, microsecond: {0, 1},
...> utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
iex> DateTime.to_naive(dt)
~N[2000-02-29 23:00:07.0] to_string(datetime)
to_string(Calendar.datetime()) :: String.t()
Преобразует данную 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> DateTime.to_string(dt)
"2000-02-29 23:00:07+01:00 CET Europe/Warsaw"
iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "UTC",
...> hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...> utc_offset: 0, std_offset: 0, time_zone: "Etc/UTC"}
iex> DateTime.to_string(dt)
"2000-02-29 23:00:07Z"
iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "AMT",
...> hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...> utc_offset: -14400, std_offset: 0, time_zone: "America/Manaus"}
iex> DateTime.to_string(dt)
"2000-02-29 23:00:07-04:00 AMT America/Manaus"
iex> dt = %DateTime{year: -100, month: 12, day: 19, zone_abbr: "CET",
...> hour: 3, minute: 20, second: 31, microsecond: {0, 0},
...> utc_offset: 3600, std_offset: 0, time_zone: "Europe/Stockholm"}
iex> DateTime.to_string(dt)
"-0100-12-19 03:20:31+01:00 CET Europe/Stockholm" to_time(datetime)
to_time(Calendar.datetime()) :: Time.t()
Так как Time не содержит информацию о дате и часовом поясе, данные будут потеряны при преобразовании.
Примеры
iex> dt = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
...> hour: 23, minute: 0, second: 7, microsecond: {0, 1},
...> utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
iex> DateTime.to_time(dt)
~T[23:00:07.0] to_unix(datetime, unit \\ :second)
to_unix(Calendar.datetime(), System.time_unit()) :: integer()
Преобразует данную datetime в время Unix.
Ожидается, что datetime использует календарь ISO с годом не менее 0.
Будет возвращено целое число с заданной единицей измерения в соответствии с System.convert_time_unit/3.
Примеры
iex> 1_464_096_368 |> DateTime.from_unix!() |> DateTime.to_unix()
1464096368
iex> dt = %DateTime{calendar: Calendar.ISO, day: 20, hour: 18, microsecond: {273806, 6},
...> minute: 58, month: 11, second: 19, time_zone: "America/Montevideo",
...> utc_offset: -10800, std_offset: 3600, year: 2014, zone_abbr: "UYST"}
iex> DateTime.to_unix(dt)
1416517099
iex> flamel = %DateTime{calendar: Calendar.ISO, day: 22, hour: 8, microsecond: {527771, 6},
...> minute: 2, month: 3, second: 25, std_offset: 0, time_zone: "Etc/UTC",
...> utc_offset: 0, year: 1418, zone_abbr: "UTC"}
iex> DateTime.to_unix(flamel)
-17412508655 truncate(datetime, precision)
(с версии 1.6.0)truncate(Calendar.datetime(), :microsecond | :millisecond | :second) :: t()
Возвращает заданную дату и время с микросекундами, усечёнными до заданной точности (:microsecond, millisecond или :second).
Заданная дата и время возвращаются без изменений, если они уже имеют меньшую точность, чем заданная.
Примеры
iex> dt1 = %DateTime{year: 2017, month: 11, day: 7, zone_abbr: "CET",
...> hour: 11, minute: 45, second: 18, microsecond: {123456, 6},
...> utc_offset: 3600, std_offset: 0, time_zone: "Europe/Paris"}
iex> DateTime.truncate(dt1, :microsecond)
#DateTime<2017-11-07 11:45:18.123456+01:00 CET Europe/Paris>
iex> dt2 = %DateTime{year: 2017, month: 11, day: 7, zone_abbr: "CET",
...> hour: 11, minute: 45, second: 18, microsecond: {123456, 6},
...> utc_offset: 3600, std_offset: 0, time_zone: "Europe/Paris"}
iex> DateTime.truncate(dt2, :millisecond)
#DateTime<2017-11-07 11:45:18.123+01:00 CET Europe/Paris>
iex> dt3 = %DateTime{year: 2017, month: 11, day: 7, zone_abbr: "CET",
...> hour: 11, minute: 45, second: 18, microsecond: {123456, 6},
...> utc_offset: 3600, std_offset: 0, time_zone: "Europe/Paris"}
iex> DateTime.truncate(dt3, :second)
#DateTime<2017-11-07 11:45:18+01:00 CET Europe/Paris> utc_now(calendar \\ Calendar.ISO)
utc_now(Calendar.calendar()) :: t()
Возвращает текущую дату и время в UTC.
Примеры
iex> datetime = DateTime.utc_now() iex> datetime.time_zone "Etc/UTC"
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.8.2/DateTime.html