Trilhas
/
Elm
Elm
/
Exercícios
/
O relógio de Kuroko
O relógio de Kuroko

O relógio de Kuroko

Exercício de aprendizagem

Introdução

Tempo

O módulo Time é usado para exibir 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 Unix epoch, 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 e, por isso, é uma boa escolha para guardar o tempo. Em uma aplicação Elm, os tempos Posix normalmente são fornecidos por fontes externas, como o navegador.

É possível transformar um Posix em um 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 geralmente não lemos Posix e preferimos a hora local, que depende da nossa localização na Terra e das regras locais de horário de verão. Em Elm, essa informação é codificada no tipo opaco Zone, normalmente fornecida 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 exibir a hora local em 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

Você deve ter notado mais dois 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

Fica a cargo de quem usa converter esses tipos personalizados em valores legíveis por humanos.

Instruções

Seu amigo japonês Kuroko é um streamer com apelo internacional. A agenda de transmissões do Kuroko é bem complicada: cada transmissão parece começar em um horário diferente a cada dia.

Ele pede sua ajuda para construir um pequeno aplicativo que mostre a agenda dele nos fusos horários locais de seus espectadores: o Kuroko's Clock. Ele tem um requisito adicional: o aplicativo deve conseguir exibir o horário em dois idiomas diferentes: japonês e inglês americano.

1. É um encontro marcado

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

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

No locale JP, o formato é 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 show

Defina uma função showLocalTime : Locale -> Int -> Int -> String que exiba um horário local (válido).

No locale US, as horas são exibidas em notação de 12 horas, junto com "PM" ou "AM", e os minutos são exibidos com zeros à esquerda.

No locale JP, a hora é exibida em notação de 24 horas antes de "時" e os minutos são exibidos sem zeros à esquerda antes de "分".

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

3. Entre no fuso horário

Defina uma função showDateTime : Locale -> Zone -> Posix -> String que exiba uma data e um horário relativos a um fuso horário em um locale específico.

Use showLocalDate e showLocalTime para exibir 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 O link abre em uma nova janela ou aba
Elm Exercism

Tudo pronto para começar O relógio de Kuroko?

Crie sua conta no Exercism para aprender e dominar Elm com 28 conceitos110 exercícios e mentoria humana de verdade, tudo de graça.