Το module Time χρησιμοποιείται για την εμφάνιση ημερομηνιών και ωρών σε μορφή που διαβάζει ο άνθρωπος.
Αν και είναι τεχνικά δυνατό να χειριστείς χρόνους με το Time, υπάρχουν πακέτα της κοινότητας του Elm που ταιριάζουν πολύ καλύτερα σε αυτή τη δουλειά, όπως το justinmimbs/date ή το CoderDennis/elm-time-format.
Οι χρόνοι αναπαρίστανται από τον αδιαφανή τύπο Posix, ο οποίος περιτυλίγει τον χρόνο εποχής Unix, δηλαδή τον αριθμό των χιλιοστών του δευτερολέπτου που έχουν περάσει από την 1η Ιανουαρίου 1970 τα μεσάνυχτα UTC.
Ένα Posix είναι μια μονοσήμαντη τιμή που δεν αλλάζει από ζώνη ώρας σε ζώνη ώρας, γι' αυτό και είναι καλή επιλογή για να κρατάς τον χρόνο.
Σε μια εφαρμογή Elm, οι χρόνοι Posix συνήθως παρέχονται από εξωτερικές πηγές, όπως ο browser.
Μπορείς να μετατρέψεις ένα Posix σε έναν αριθμό από χιλιοστά του δευτερολέπτου και το αντίστροφο με τις παρακάτω συναρτήσεις:
posixToMillis : Posix -> Int
millisToPosix : Int -> Posix
Στην καθημερινή μας ζωή, συνήθως δε διαβάζουμε Posix και προτιμάμε την τοπική ώρα, η οποία εξαρτάται από τη θέση μας στη Γη και από τους τοπικούς κανόνες θερινής ώρας.
Στο Elm, αυτή η πληροφορία κωδικοποιείται στον αδιαφανή τύπο Zone, ο οποίος συνήθως παρέχεται από τον browser.
Υπάρχει μια ειδική 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 είναι streamer με διεθνή απήχηση. Το πρόγραμμα των stream του Kuroko είναι αρκετά περίπλοκο, αφού κάθε stream φαίνεται να ξεκινά σε διαφορετική ώρα κάθε μέρα.
Σου ζητά να τον βοηθήσεις να φτιάξετε μια μικρή εφαρμογή που θα δείχνει το πρόγραμμά του στις τοπικές ζώνες ώρας των θεατών του: το 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, οι ώρες θα εμφανίζονται σε 12ωρη μορφή μαζί με "PM" ή "AM", και τα λεπτά θα εμφανίζονται με αρχικά μηδενικά.
Στο locale JP, η ώρα θα εμφανίζεται σε 24ωρη μορφή πριν από το "時" και τα λεπτά θα εμφανίζονται χωρίς αρχικά μηδενικά πριν από το "分".
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分"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elm με 28 έννοιες110 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.