Tracks
/
Elm
Elm
/
Ejercicios
/
El reloj de Kuroko
El reloj de Kuroko

El reloj de Kuroko

Ejercicio de aprendizaje

Introducción

Tiempo

El módulo Time se usa para mostrar fechas y horas legibles para humanos. 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.

Posix

Los tiempos se representan con el tipo opaco Posix, que envuelve el tiempo de la época Unix, la cantidad de milisegundos transcurridos desde la medianoche UTC del 1 de enero de 1970. Un Posix es un valor no ambiguo que no varía entre zonas horarias, así que es una buena opción para llevar la cuenta del tiempo. En una aplicación de Elm, los tiempos Posix normalmente los proporcionan fuentes externas, como el navegador.

Es posible transformar un Posix en una cantidad de milisegundos y viceversa con las siguientes funciones:

posixToMillis : Posix -> Int
millisToPosix : Int -> Posix

Zonas horarias

En nuestro día a día, los humanos por lo general no leemos Posix, sino que 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 se codifica en el tipo opaco Zone, que normalmente proporciona el navegador.

Existe una Zone especial que siempre está disponible:

utc : Zone

Tiempos legibles para humanos

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 puedes usar para eso:

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

Te habrás dado cuenta de que hay 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

Queda a cargo de quien use la biblioteca convertir estos tipos personalizados en valores legibles para humanos.

Instrucciones

Tu amigo japonés Kuroko es un streamer con alcance internacional. El horario de transmisiones de Kuroko es bastante complicado, y cada transmisión parece empezar a una hora distinta todos los días.

Él te pide ayuda para crear una pequeña aplicación que muestre su horario en la zona horaria local de sus espectadores: Kuroko's Clock. Tiene un requisito adicional: la aplicación debe poder mostrar la hora en dos idiomas distintos: japonés e inglés estadounidense.

1. Es una fecha

Define una función showLocalDate : Locale -> Int -> Month -> Int -> String que muestre una fecha local (válida).

En la configuración regional US, el formato será Month/Day/Year sin ceros a la izquierda.

En 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日"

2. Es la hora del espectáculo

Define una función showLocalTime : Locale -> Int -> Int -> String que muestre una hora local (válida).

En la configuración regional US, las horas se mostrarán en notación de 12 horas junto con «PM» o «AM», y los minutos se mostrarán con ceros a la izquierda.

En la configuración regional JP, la hora se mostrará en notación 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分"

3. Entra en la zona

Define una función showDateTime : Locale -> Zone -> Posix -> String que muestre una fecha y una hora relativas a una zona horaria en una configuración regional específica.

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分"
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Elm Exercism

¿Todo listo para empezar El reloj de Kuroko?

Regístrate en Exercism para aprender y dominar Elm con 28 conceptos110 ejercicios y mentoría humana real, todo gratis.