Це здається справді безглуздим запитанням, але як можна отримати та відобразити поточну дату чи час у Elixir? Я спробував переглянути документи, але не міг нічого знайти. Чи потрібно мені використовувати функцію Erlang?
Це здається справді безглуздим запитанням, але як можна отримати та відобразити поточну дату чи час у Elixir? Я спробував переглянути документи, але не міг нічого знайти. Чи потрібно мені використовувати функцію Erlang?
Відповіді:
Щоб конкретніше відповісти на ваше запитання (хоча я дуже ціную рекомендацію Onorio використовувати Timex!), Ви можете отримати поточну дату та час із стандартної бібліотеки Erlang за допомогою :calendar.universal_time()
або :calendar.local_time()
. У модулі є цілий ряд корисних функцій для роботи з datetime
типом Ерланга calendar
, але вони дещо обмежені і не надають вам нічого для синтаксичного аналізу чи форматування дат, саме тут з’являється Timex.
Ви можете використовувати, DateTime.utc_now/0
щоб отримати UTC DateTime.
З 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
Якщо ви не дбаєте про часовий пояс і просто хочете чіткий час і дату, використовуйте NaiveDateTime
:
NaiveDateTime.utc_now
# => ~N[2017-11-30 20:49:54.660724]
Якщо ви також хочете отримати детальні відомості про часовий пояс, використовуйте DateTime
, що також поверне такі речі, як назва часового поясу, зміщення UTC, зміщення STD та скорочення часового поясу:
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
з цих модулів , щоб отримати конкретні значення дати і часу від дати і часу структур.
Я думаю, що найкращим варіантом є використання бібліотеки timex Пола Шенфельдера (він же BitWalker) для Elixir. Lib знаходиться тут: https://github.com/bitwalker/timex, і ви можете отримати пакет з hex.pm https://hex.pm/packages/timex . Пол люб’язно пояснив, як користуватися бібліотекою, на сторінці readme цього репозиторію github.
Ви можете телефонувати до рідних Erlang libs, але я думаю, що lib Пола є вищим, коли хтось має справу з Elixir.
Це залежить від того, у якому форматі ви його хочете.
Ви можете використовувати будь-яку функцію в стандартній бібліотеці Erlang від Elixir. Традиційно ви отримуєте час за допомогою now/0
функції:
iex(1)> :erlang.now
{1487, 549978, 29683}
Це представляє 1 time_t
487 549 978,29683, що становить 19 хвилин, 38,29683 секунди після півночі UTC у понеділок, 20 лютого 2017 року.
Однак, оскільки з Erlang / OTP 18 ця функція застаріла; одна з причин полягає в тому, що Erlang гарантує, що повернена вартість буде збільшуватися з кожним дзвінком. Якщо викликати його в щільному циклі на машині досить швидко, щоб викликати його більше одного разу за мікросекунду, повернута мітка часу випередить реальний час.
Заміна - це API з більшою точністю та контролем . Основним інтерфейсом цього нового API є os:system_time/0
функція, яка повертає час епохи в системно визначеному блоці:
iex(2)> :os.system_time
1487549978296838000
Ви можете надіслати запит на конкретну одиницю system_time/1
, хоча:
iex(3)> :os.system_time(:millisecond)
1487549978296
Починаючи з Elixir 1.2, ці функції також були доступні в рідному System
модулі :
iex(4)> System.system_time(:second)
1487549978
Для більш дружнього, але все ще рідного інтерфейсу Elixir використовуйте calendar
модуль, який надасть вам кортежі:
iex(5)> :calendar.universal_time
{{2017, 2, 20}, {0, 19, 38}}
Починаючи з 1.3, Elixir також має власний набір модулів для маніпулювання датами та часом: Date
і DateTime
. Ви можете використовувати його функції, щоб отримати поточну дату або час приблизно так:
iex(6)> Date.utc_today
~D[2017-02-20]
iex(7)> DateTime.utc_now
#DateTime<2017-02-20 00:19:38.29683Z>
Щоб отримати кількість мілісекунд (мітка часу Unix):
DateTime.utc_now() |> DateTime.to_unix(:millisecond)
Якщо вам потрібно мати справу з переходом на літній час або часові пояси, я створив для цього бібліотеку: Календар .
Щоб отримати поточний час, ви б використовували, наприклад, Calendar.DateTime.now("America/Los_Angeles")
поточний час у Лос-Анджелесі або Calendar.DateTime.now_utc
поточний час у UTC.
Ну, Timex зазвичай виручає, однак деякі наведені нижче трюки можуть вам допомогти:
{erl_date, erl_time} = :calendar.local_time()
# {{2020, 11, 19}, {0, 6, 36}}
{:ok, time} = Time.from_erl(erl_time)
# {:ok, ~T[00:06:36]}
{:ok, date} = Date.from_erl(erl_date)
# {:ok, ~D[2020-11-19]}
Calendar.strftime(time, "%c", preferred_datetime: "%H:%M:%S")
# "00:06:36"
Calendar.strftime(date, "%c", preferred_datetime: "%m-%d-%Y")
# "11-19-2020"