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.
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
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
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.
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.
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日"
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分"
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分"
Inscreve-te no Exercism para aprenderes e dominares Elm com 28 conceitos110 exercícios, e mentoria humana real, tudo grátis.