Le module Time sert à afficher des dates et des heures lisibles par un être humain.
S'il est techniquement possible de manipuler des dates et des heures avec Time, il existe des paquets de la communauté Elm bien plus adaptés à cette tâche, comme justinmimbs/date ou CoderDennis/elm-time-format.
Les instants sont représentés par le type opaque Posix, qui encapsule le temps Unix epoch, le nombre de millisecondes écoulées depuis le 1er janvier 1970 à minuit UTC.
Un Posix est une valeur non ambiguë qui ne varie pas d'un fuseau horaire à l'autre, ce qui en fait un bon choix pour mesurer le temps.
Dans une application Elm, les instants Posix sont généralement fournis par des sources externes, comme le navigateur.
Il est possible de transformer un Posix en un nombre de millisecondes, et inversement, avec les fonctions suivantes :
posixToMillis : Posix -> Int
millisToPosix : Int -> Posix
Dans notre vie quotidienne, nous ne lisons généralement pas de Posix et préférons l'heure locale, qui dépend de notre position sur Terre et des règles locales d'heure d'été.
En Elm, cette information est encodée dans le type opaque Zone, généralement fourni par le navigateur.
Il existe une Zone particulière qui est toujours accessible :
utc : Zone
Avec un Posix et une Zone, on dispose de suffisamment d'informations pour afficher l'heure locale avec le niveau de détail souhaité.
Voici une liste des fonctions qui peuvent servir à cela :
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
Tu auras sans doute remarqué deux autres types personnalisés de Time :
type Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec
type Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun
Il revient aux utilisateurs de convertir ces types personnalisés en valeurs lisibles par un humain.
Ton ami japonais Kuroko est un streameur à l'audience internationale. Le programme de diffusion de Kuroko est assez complexe : chaque diffusion semble commencer à une heure différente d'un jour à l'autre.
Il te demande de l'aider à construire une petite application qui affichera son planning dans les fuseaux horaires locaux de ses spectateurs : Kuroko's Clock. Il a une exigence supplémentaire : l'application doit pouvoir afficher l'heure dans deux langues différentes : le japonais et l'anglais américain.
Définis une fonction showLocalDate : Locale -> Int -> Month -> Int -> String qui affichera une date locale (valide).
Dans la locale US, le format sera Month/Day/Year, sans zéros de tête.
Dans la locale JP, le format sera Year年Month月Day日, également sans zéros de tête.
showLocalDate US 2025 May 1
-- "5/1/2025"
showLocalDate JP 2025 May 1
-- "2025年5月1日"
Définis une fonction showLocalTime : Locale -> Int -> Int -> String qui affichera une heure locale (valide).
Dans la locale US, les heures seront affichées au format 12 heures avec "PM" ou "AM", et les minutes seront affichées avec des zéros de tête.
Dans la locale JP, l'heure sera affichée au format 24 heures avant "時", et les minutes seront affichées sans zéros de tête avant "分".
showLocalTime US 13 8
-- "1:08 PM"
showLocalTime JP 13 8
-- "13時8分"
Définis une fonction showDateTime : Locale -> Zone -> Posix -> String qui affichera une date et une heure relatives à un fuseau horaire dans une locale donnée.
Utilise showLocalDate et showLocalTime pour afficher le résultat final.
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分"
Inscris-toi sur Exercism pour apprendre et maîtriser Elm avec 28 concepts110 exercices, et un vrai mentorat humain, le tout gratuitement.