El módulo Time se usa para mostrar fechas y horas legibles para las personas.
Aunque técnicamente es posible manipular tiempos con Time, hay paquetes de la comunidad de Elm mucho más adecuados para esa tarea, como justinmimbs/date o CoderDennis/elm-time-format.
Los tiempos se representan con el tipo opaco Posix, que envuelve el tiempo de la época Unix, el número de milisegundos transcurridos desde el 1 de enero de 1970 a medianoche UTC.
Un Posix es un valor no ambiguo que no varía entre zonas horarias, por lo que es una buena opción para guardar el tiempo.
En una aplicación de Elm, lo habitual es que las fuentes externas, como el navegador, proporcionen los tiempos Posix.
Es posible transformar un Posix en un número de milisegundos y viceversa con las siguientes funciones:
posixToMillis : Posix -> Int
millisToPosix : Int -> Posix
En nuestro día a día, los humanos normalmente no leemos Posix y preferimos la hora local, que depende de nuestra ubicación en la Tierra y de las reglas locales de horario de verano.
En Elm, esta información está codificada en el tipo opaco Zone, que normalmente proporciona el navegador.
Hay una Zone especial a la que siempre se puede acceder:
utc : Zone
Con un Posix y una Zone, tenemos suficiente información para mostrar la hora local con cualquier nivel de detalle.
Esta es una lista de las funciones que se pueden usar para ello:
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
Habrás visto otros dos tipos personalizados 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
Convertir estos tipos personalizados en valores legibles para las personas queda en manos de quien los use.
Tu amigo japonés Kuroko es un streamer con tirón internacional. El calendario de directos de Kuroko es bastante enrevesado: cada directo parece empezar a una hora distinta cada día.
Te pide ayuda para crear una pequeña aplicación que muestre su horario en la zona horaria local de sus espectadores: el reloj de Kuroko. Tiene un requisito adicional: la aplicación debe poder mostrar la hora en dos idiomas distintos, japonés e inglés estadounidense.
Define una función showLocalDate : Locale -> Int -> Month -> Int -> String que muestre una fecha local (válida).
Con la configuración regional US, el formato será Month/Day/Year, sin ceros a la izquierda.
Con la configuración regional JP, el formato será Year年Month月Day日, también sin ceros a la izquierda.
showLocalDate US 2025 May 1
-- "5/1/2025"
showLocalDate JP 2025 May 1
-- "2025年5月1日"
Define una función showLocalTime : Locale -> Int -> Int -> String que muestre una hora local (válida).
Con la configuración regional US, las horas se mostrarán en formato de 12 horas, junto con «PM» o «AM», y los minutos se mostrarán con ceros a la izquierda.
Con la configuración regional JP, la hora se mostrará en formato de 24 horas antes de «時» y los minutos se mostrarán sin ceros a la izquierda antes de «分».
showLocalTime US 13 8
-- "1:08 PM"
showLocalTime JP 13 8
-- "13時8分"
Define una función showDateTime : Locale -> Zone -> Posix -> String que muestre una fecha y una hora relativas a una zona horaria y en una configuración regional concreta.
Usa showLocalDate y showLocalTime para mostrar el resultado 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分"
Regístrate en Exercism para aprender y dominar Elm con 28 conceptos110 ejercicios y mentoría humana real, todo gratis.