Подтвердить что ты не робот

Получение текущей даты и/или времени в Elixir

Это кажется действительно глупым вопросом, но как получить и отобразить текущую дату или время в Elixir? Я попытался пройти документы, но ничего не смог найти. Нужно ли использовать функцию Erlang?

4b9b3361

Ответ 1

Чтобы ответить на ваш вопрос более конкретно (хотя я очень ценю рекомендацию Onorio использовать Timex!), вы можете получить текущую дату и время из стандартной библиотеки Erlang, используя :calendar.universal_time() или :calendar.local_time(). Существует ряд полезных функций для работы с типом Erlang datetime в модуле calendar, но они несколько ограничены и не предоставляют вам ничего для синтаксического анализа или даты форматирования, в который входит Timex.

Ответ 4

Я думаю, что лучше всего использовать библиотеку timex для Paul Schoenfelder (aka BitWalker) для Elixir. Библиотека находится здесь: https://github.com/bitwalker/timex, и вы можете получить пакет из hex.pm https://hex.pm/packages/timex. Пол любезно предоставил хорошее объяснение того, как использовать библиотеку на странице readme этого репозитория github.

Вы можете совершать звонки в собственные библиотеки Erlang, но я думаю, что Paul lib превосходит, когда вы имеете дело с Elixir.

Ответ 5

Вы также можете использовать :os.timestamp\0, который возвращает {megaseconds, seconds, microseconds} из UTC. :os.timestamp |> :calendar.now_to_datetime предоставит вам теперь в стандартном формате erlang {{YYYY, MM, DD}, {HH, MM, SS}}.

Ответ 6

Это зависит от того, в каком формате вы хотите.

Вы можете использовать любую функцию в стандартной библиотеке Erlang от Elixir. Традиционно вы получите время с помощью функции now/0:

iex(1)> :erlang.now
{1487, 549978, 29683}

Однако, поскольку Erlang/OTP 18, эта функция устарела в пользу API с большей точностью и контролем. Первичным интерфейсом к этому новому API является функция os:system_time/0, которая возвращает эпохальное время в системном блоке:

iex(2)> :os.system_time
1487550102372148000

Вы можете запросить конкретное устройство с system_time/1, хотя:

iex(3)> :os.system_time(:millisecond)
1487549663928

С Elixir 1.2 эти функции также доступны в нативном System модуле:

iex(4)> System.system_time(:second)
1487549711

Для более дружелюбного, но все же основанного на Elixir интерфейса, используйте модуль calendar, который даст вам кортежи:

iex(5)> :calendar.universal_time
{{2017, 2, 20}, {0, 26, 47}}

Начиная с 1.3, Elixir также имеет свой собственный набор модулей для управления датами и временем: Date и DateTime. Вы можете использовать его функции для получения текущей даты или времени:

iex(6)> Date.utc_today
~D[2017-02-20]
iex(7)> DateTime.utc_now
%DateTime{calendar: Calendar.ISO, day: 20, hour: 0, microsecond:   {776208, 6},
minute: 27, month: 2, second: 51, std_offset: 0, time_zone: "Etc/UTC",
utc_offset: 0, year: 2017, zone_abbr: "UTC"}

Ответ 7

Если вам нужно иметь дело с летним временем или часовыми поясами, я создал для этого библиотеку: Calendar.

Чтобы получить текущее время, вы будете использовать, например, Calendar.DateTime.now("America/Los_Angeles") для текущего времени в Лос-Анджелесе или Calendar.DateTime.now_utc для текущего времени в формате UTC.

Ответ 8

NaiveDateTime

Если вам не нужен часовой пояс и вы просто хотите чистую дату и время, используйте NaiveDateTime:

NaiveDateTime.utc_now
# => ~N[2017-11-30 20:49:54.660724]

DateTime

Если вы хотите также получить информацию о часовом поясе, используйте DateTime, который также вернет такие вещи, как имя часового пояса, смещение по UTC, смещение по СТД, и сокращенное поясное время:

DateTime.utc_now
# => %DateTime{calendar: Calendar.ISO, day: 30, hour: 20, microsecond: {667345, 6}, minute: 51, month: 11, second: 58, std_offset: 0, time_zone: "Etc/UTC", utc_offset: 0, year: 2017, zone_abbr: "UTC"}

Затем вы можете также вызвать to_date/1 и to_time/1 из этих модулей, чтобы получить конкретные значения даты и времени из структур datetime.

Ответ 9

Чтобы получить временную метку unix

DateTime.to_unix(DateTime.utc_now)