Модуль Time використовують, щоб показувати дати й час у зрозумілому для людини вигляді.
Хоча технічно працювати з часом можна й засобами Time, у спільноті Elm є пакети, які підходять для цього значно краще, як-от justinmimbs/date або CoderDennis/elm-time-format.
Час подається непрозорим типом Posix, який обгортає час Unix-епохи, тобто кількість мілісекунд, що минули з півночі 1 січня 1970 року за UTC.
Posix - це однозначне значення, яке не змінюється від часового поясу, тому добре підходить для зберігання часу.
У застосунку Elm значення Posix зазвичай надходять із зовнішніх джерел, як-от браузер.
Перетворити Posix на число мілісекунд і навпаки можна за допомогою таких функцій:
posixToMillis : Posix -> Int
millisToPosix : Int -> Posix
У повсякденному житті ми зазвичай не читаємо Posix, а надаємо перевагу місцевому часу, який залежить від нашого розташування на Землі та від місцевих правил переходу на літній час.
В Elm ця інформація закодована в непрозорому типі Zone, який зазвичай надає браузер.
Є один особливий Zone, доступний завжди:
utc : Zone
Маючи Posix і Zone, ми маємо достатньо інформації, щоб показати місцевий час із будь-яким рівнем деталізації.
Ось список функцій, які для цього можна використати:
toYear : Zone -> Posix -> Int
toMonth : Zone -> Posix -> Month
toDay : Zone -> Posix -> Int
toWeekday : Zone -> Posix -> Weekday
toHour : Zone -> Posix -> Int
toMinute : Zone -> Posix -> Int
toSecond : Zone -> Posix -> Int
toMillis : Zone -> Posix -> Int
Ми, напевно, вже помітили ще два власні типи з Time:
type Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec
type Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun
Перетворення цих власних типів на зрозумілі для людини значення залишається за користувачами.
Наш японський друг Куроко працює стрімером і має міжнародну популярність. Розклад стрімів Куроко досить заплутаний: здається, кожен стрім щодня починається в різний час.
Він просить допомогти створити невеликий застосунок, який буде показувати його розклад у місцевих часових поясах глядачів: Годинник Куроко. У нього є додаткова вимога: застосунок має вміти показувати час двома різними мовами: японською та англійською (США).
Визначте функцію showLocalDate : Locale -> Int -> Month -> Int -> String, яка відображатиме (дійсну) місцеву дату.
У локалі US формат буде Month/Day/Year без провідних нулів.
У локалі JP формат буде Year年Month月Day日, також без провідних нулів.
showLocalDate US 2025 May 1
-- "5/1/2025"
showLocalDate JP 2025 May 1
-- "2025年5月1日"
Визначте функцію showLocalTime : Locale -> Int -> Int -> String, яка відображатиме (дійсний) місцевий час.
У локалі US години буде показано у 12-годинному форматі разом із «PM» або «AM», а хвилини буде показано з провідними нулями.
У локалі JP годину буде показано у 24-годинному форматі перед «時», а хвилини буде показано без провідних нулів перед «分».
showLocalTime US 13 8
-- "1:08 PM"
showLocalTime JP 13 8
-- "13時8分"
Визначте функцію showDateTime : Locale -> Zone -> Posix -> String, яка відображатиме дату й час відносно часового поясу в певній локалі.
Використайте showLocalDate та showLocalTime, щоб відобразити остаточний результат.
showDateTime US Time.utc (Time.millisToPosix 0)
-- "1/1/1970 12:00 AM"
showDateTime JP Time.utc (Time.millisToPosix 0)
-- "1970年1月1日0時0分"
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elm, а також 28 концепцій110 вправ та справжнє наставництво від людей, і все це безкоштовно.