Percursos
/
Elm
Elm
/
Exercícios
/
O Relógio do Kuroko
O Relógio do Kuroko

O Relógio do Kuroko

Exercício de aprendizagem

Introdução

Tempo

O módulo Time serve para mostrar datas e horas legíveis por humanos. Embora seja tecnicamente possível manipular tempos com Time, existem pacotes da comunidade Elm muito mais adequados para essa tarefa, como justinmimbs/date ou CoderDennis/elm-time-format.

Posix

Os tempos são representados pelo tipo opaco Posix, que encapsula o tempo epoch do Unix: o número de milissegundos decorridos desde 1 de janeiro de 1970 à meia-noite UTC. Um Posix é um valor não ambíguo que não varia entre fusos horários, o que o torna uma boa escolha para guardar tempo. Numa aplicação Elm, os tempos Posix são normalmente fornecidos por fontes externas, como o navegador.

É possível transformar um Posix num número de milissegundos e vice-versa com as seguintes funções:

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

Fusos horários

No nosso dia a dia, nós, humanos, normalmente não lemos Posix e preferimos antes a hora local, que depende da nossa localização na Terra e das regras locais de hora de verão. Em Elm, esta informação está codificada no tipo opaco Zone, normalmente fornecido pelo navegador.

Existe uma Zone especial que está sempre acessível:

utc : Zone

Tempos humanos

Com um Posix e uma Zone, temos informação suficiente para mostrar a hora local com qualquer nível de detalhe. Aqui está uma lista das funções que podem ser usadas para isso:

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

Já deves ter reparado em mais dois tipos personalizados do Time:

type Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec
type Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun

Converter estes tipos personalizados em valores legíveis por humanos fica ao critério de quem usa o código.

Instruções

O teu amigo japonês Kuroko é um streamer com alcance internacional. O calendário de transmissões do Kuroko é bastante complexo: cada transmissão parece começar a uma hora diferente todos os dias.

Ele pede a tua ajuda para construir uma pequena aplicação que mostre o seu calendário nos fusos horários locais dos seus espetadores: o Relógio do Kuroko. Tem ainda um requisito adicional: a aplicação deve conseguir mostrar a hora em dois idiomas diferentes: japonês e inglês dos Estados Unidos.

1. É uma data

Define uma função showLocalDate : Locale -> Int -> Month -> Int -> String que mostra uma data local (válida).

No locale US, o formato será Month/Day/Year, sem zeros à esquerda.

No locale JP, o formato será Year年Month月Day日, também sem zeros à esquerda.

showLocalDate US 2025 May 1
    -- "5/1/2025"
showLocalDate JP 2025 May 1
    -- "2025年5月1日"

2. É hora do espetáculo

Define uma função showLocalTime : Locale -> Int -> Int -> String que mostra uma hora local (válida).

No locale US, as horas serão mostradas em notação de 12 horas, acompanhadas de «PM» ou «AM», e os minutos serão mostrados com zeros à esquerda.

No locale JP, a hora será mostrada em notação de 24 horas antes de «時» e os minutos serão mostrados sem zeros à esquerda antes de «分».

showLocalTime US 13 8
    -- "1:08 PM"
showLocalTime JP 13 8
    -- "13時8分"

3. Entra na zona

Define uma função showDateTime : Locale -> Zone -> Posix -> String que mostra uma data e uma hora relativas a um fuso horário num determinado locale.

Usa showLocalDate e showLocalTime para mostrar o 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 via GitHub A ligação abre numa nova janela ou separador
Elm Exercism

Estás pronto para começar O Relógio do Kuroko?

Inscreve-te no Exercism para aprenderes e dominares Elm com 28 conceitos110 exercícios, e mentoria humana real, tudo grátis.