Робота з датою в Erlang

Сьогодні ми познайомимося з Erlang-модулем calendar для роботи з датою. Дізнаємося як отримати час, перевірити отриманий результат на правильність, порівняти дві дати тощо.

Як отримати місцевий час

1> Current = calendar:local_time().
{{2017,1,6},{13,45,12}}

Функція повертає кортеж, який складається ще з двох кортежів: {{Year, Month, Day}, {Hour, Minute, Second}}.

Тут:

  • Year - число типу integer, при чому воно не може бути скороченим. Тобто 1993 рік, не можна записати просто як 93
  • Month - приймає значення від 1 до 12
  • Day - від 1 до 31
  • Hour - від 0 до 23
  • Minute - від 0 до 59
  • Second - від 0 до 59

Також ми можемо витягнути значення, яких ми потребуємо:

2> {{Year, Month, Day}, {Hour, Minute, Second}} = calendar:local_time().
{{2017,1,6},{13,45,12}}
3> Year.
2017
4> Hour.
13

Або навіть так, якщо нам не треба всі:

5> Current0 = calendar:local_time().
{{2017,1,6},{14,4,39}}
6> {_, {Hour, _, _}} = Current0.
{{2017,1,6},{14,4,39}}
7> Hour.
14

Як отримати час UTC

8> calendar:universal_time().
{{2017,1,6},{13,7,57}}

Також ми можемо перевести місцевий час до UTC та навпаки:

9> UTCTime = calendar:local_time_to_universal_time({{2017,1,6},{13,7,57}}).
{{2017,1,6},{14,7,57}}
10> calendar:universal_time_to_local_time(UTCTime).
{{2017,1,6},{13,7,57}}

Конвертація часу у секунди

Щоб перевести час({Time}) у секунди й назад, прописуємо:

11> Time = {10, 30, 48}.
{10, 30, 48}
12> Seconds = calendar:time_to_seconds(Time).
37848
13> calendar:seconds_to_time(Seconds).
{10, 30, 48}

Перевіряємо чи рік високосний

14> calendar:is_leap_year(2016).
true
15> calendar:is_leap_year(2017).
false

Функція calendar:is_leap_year() повертає true, коли рік високосний та false якщо ні.

Перевіряємо дату на правильність

За допомогою calendar:valid_date() перевіряємо, чи передана дата вірна.

16> calendar:valid_date({2017, 01, 06}).
true

% 13 місяця не існує, тому функція повертає false
17> calendar:valid_date({2017, 13, 06}).
false

Знаходимо день тижня

За датою ми можемо знайти номер дня тижня.

18> calendar:day_of_the_week({2017, 01, 06}).
5
% 5 - п'ятниця

Тут 1 - це Понеділок(Mondey), 2 - Вівторок(Tuesday)...і 7 - Неділя(Sunday).

Знаходимо різницю, між двома датами

Для прикладу, знайду свій вік(ну а що?). Записуємо у дві змінні дві дати з проміжком, який і будемо знаходити.

19> Date1 = {{2017, 01, 06}, {0, 0, 0}}.
{2017, 08, 17}
20> Date2 = {{1998, 08, 17}, {0, 0, 0}}.
{1998, 08, 17}
21> calendar:time_difference(Date1, Date2).
{-6717,{0,0,0}}

% міняємо аргументи місцями, щоб отримати додатнє значення {6717,{0,0,0}}
22> calendar:time_difference(Date2, Date1).
{6717,{0,0,0}}

Як бачите мені 6717 днів. Дивний звичайно спосіб дізнатися скільки ти вже на цьому світі, і доки я пішов роздумувати про те яке життя коротке, вам раджу ще заглянути до документації цього модуля для більш детальної інформації.