Это кажется действительно глупым вопросом, но как получить и отобразить текущую дату или время в Elixir? Я попытался пройти документы, но ничего не смог найти. Нужно ли использовать функцию Erlang?
Получение текущей даты и/или времени в Elixir
Ответ 1
Чтобы ответить на ваш вопрос более конкретно (хотя я очень ценю рекомендацию Onorio использовать Timex!), вы можете получить текущую дату и время из стандартной библиотеки Erlang, используя :calendar.universal_time()
или :calendar.local_time()
. Существует ряд полезных функций для работы с типом Erlang datetime
в модуле calendar
, но они несколько ограничены и не предоставляют вам ничего для синтаксического анализа или даты форматирования, в который входит Timex.
Ответ 2
вы можете использовать DateTime.utc_now/0
для получения utc DateTime, если вы можете работать с этим
http://elixir-lang.org/docs/master/elixir/DateTime.html#utc_now/0
Ответ 3
От Erlang 19.1:
:os.system_time(:millisecond)
От Erlang 18:
:os.system_time(:milli_seconds)
Дает текущую временную метку UNIX UTC.
Спасибо @HenrikN за ссылку на сообщение в блоге http://michal.muskala.eu/2015/07/30/unix-timestamps-in-elixir.html
Ответ 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)