ماژول Time برای نمایش تاریخ و زمان به شکلی قابلخواندن برای انسان به کار میرود.
هرچند از نظر فنی میتوان با Time زمانها را دستکاری کرد، بستههای جامعهی الم برای این کار بسیار مناسبترند، مانند justinmimbs/date یا CoderDennis/elm-time-format.
زمانها با نوع مبهم Posix نمایش داده میشوند که زمان مبدأ یونیکس را در خود میپیچد؛ یعنی تعداد میلیثانیههای سپریشده از نیمهشب اول ژانویهی ۱۹۷۰ به وقت UTC.
یک Posix مقداری بدون ابهام است که بین مناطق زمانی تغییر نمیکند، بنابراین انتخاب خوبی برای نگهداشتن زمان به شمار میرود.
در یک برنامهی الم، زمانهای Posix معمولاً از منابع بیرونی مانند مرورگر تأمین میشوند.
میتوان با توابع زیر یک Posix را به تعدادی میلیثانیه تبدیل کرد و برعکس:
posixToMillis : Posix -> Int
millisToPosix : Int -> Posix
در زندگی روزمره، ما انسانها معمولاً Posix را نمیخوانیم و در عوض زمان محلی را ترجیح میدهیم، که به موقعیت ما روی زمین و قواعد محلی ساعت تابستانی بستگی دارد.
در الم، این اطلاعات در نوع مبهم 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
تبدیل این انواع سفارشی به مقادیر قابلخواندن برای انسان بر عهدهی کاربران گذاشته شده است.
دوست ژاپنی شما Kuroko یک استریمر با محبوبیت بینالمللی است. برنامهی پخش Kuroko نسبتاً پیچیده است و به نظر میرسد هر پخش هر روز در زمانی متفاوت آغاز میشود.
او از شما میخواهد که در ساختن برنامهای کوچک به او کمک کنید تا برنامهی پخشش را در مناطق زمانی محلی بینندگانش نمایش دهد: Kuroko's Clock. او یک خواستهی دیگر هم دارد: برنامه باید بتواند زمان را به دو زبان مختلف نمایش دهد: ژاپنی و انگلیسی آمریکایی.
تابعی به اسم showLocalDate : Locale -> Int -> Month -> Int -> String تعریف کنید که یک تاریخ محلی (معتبر) را نمایش میدهد.
در locale US، قالب بهصورت Month/Day/Year و بدون صفرهای ابتدایی خواهد بود.
در locale 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 تعریف کنید که یک زمان محلی (معتبر) را نمایش میدهد.
در locale US، ساعتها در قالب ۱۲ساعته و همراه با «PM» یا «AM» نمایش داده میشوند و دقیقهها با صفرهای ابتدایی نشان داده میشوند.
در locale JP، ساعت در قالب ۲۴ساعته و پیش از «時» و دقیقهها بدون صفرهای ابتدایی و پیش از «分» نمایش داده میشوند.
showLocalTime US 13 8
-- "1:08 PM"
showLocalTime JP 13 8
-- "13時8分"
تابعی به اسم showDateTime : Locale -> Zone -> Posix -> String تعریف کنید که تاریخ و زمان را نسبت به یک منطقهی زمانی و در یک locale مشخص نمایش میدهد.
برای نمایش نتیجهی نهایی از 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分"