Отримання поточної дати та / або часу в Elixir


83

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

Відповіді:


56

Щоб конкретніше відповісти на ваше запитання (хоча я дуже ціную рекомендацію Onorio використовувати Timex!), Ви можете отримати поточну дату та час із стандартної бібліотеки Erlang за допомогою :calendar.universal_time()або :calendar.local_time(). У модулі є цілий ряд корисних функцій для роботи з datetimeтипом Ерланга calendar, але вони дещо обмежені і не надають вам нічого для синтаксичного аналізу чи форматування дат, саме тут з’являється Timex.


1
Чудова відповідь, дякую вам обом, і я точно перевірю Timex!
Грем Конзетт



17

NaiveDateTime

Якщо ви не дбаєте про часовий пояс і просто хочете чіткий час і дату, використовуйте 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з цих модулів , щоб отримати конкретні значення дати і часу від дати і часу структур.


12

Я думаю, що найкращим варіантом є використання бібліотеки timex Пола Шенфельдера (він же BitWalker) для Elixir. Lib знаходиться тут: https://github.com/bitwalker/timex, і ви можете отримати пакет з hex.pm https://hex.pm/packages/timex . Пол люб’язно пояснив, як користуватися бібліотекою, на сторінці readme цього репозиторію github.

Ви можете телефонувати до рідних Erlang libs, але я думаю, що lib Пола є вищим, коли хтось має справу з Elixir.


5
Дякуємо за рекомендацію Onorio! Для всіх, хто читає це, я дуже відкритий для внесків, щоб ми могли зробити Timex переходом до бібліотеки для дати / часу в Elixir і, можливо, одного дня об’єднати його у стандартну бібліотеку Elixir, якщо це повинно бути на рівні. Якщо ви зацікавлені у допомозі, напишіть мені повідомлення або зануртесь у відстежувач проблем на GitHub і надішліть кілька запитів на витяг!
bitwalker

1
@bitwalker Так, Ерланг / Еліксир має багато речей зробити для дати / часу. І я сподіваюся, що timex також можна об’єднати в Elixir :)
Тоні Хан,

11

Це залежить від того, у якому форматі ви його хочете.

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

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

Це представляє 1 time_t487 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>

8

Щоб отримати кількість мілісекунд (мітка часу Unix):

DateTime.utc_now() |> DateTime.to_unix(:millisecond)

1
Гарний Сем, саме те, що я шукав;)
Денніс,

7

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


3
І отримати це в позначці
Генрік Н

6

Якщо вам потрібно мати справу з переходом на літній час або часові пояси, я створив для цього бібліотеку: Календар .

Щоб отримати поточний час, ви б використовували, наприклад, Calendar.DateTime.now("America/Los_Angeles")поточний час у Лос-Анджелесі або Calendar.DateTime.now_utcпоточний час у UTC.



0

Ну, 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.