Percursos
/
C#
C#
/
Exercícios
/
O salão de beleza torna-se global
O salão de beleza torna-se global

O salão de beleza torna-se global

Exercício de aprendizagem

Introdução

Tempo

O conceito de tempo é tratado em .NET usando a estrutura DateTime. Existem rotinas para converter entre a hora local e UTC. As operações aritméticas podem ser efetuadas com a ajuda de TimeSpan.

Fuso horário

A classe TimeZoneInfo fornece rotinas para lidar com as diferenças entre fusos horários. A classe TimeZoneInfo contém também métodos que ajudam a lidar com a hora de verão.

A classe CultureInfo suporta formatos de data e hora dependentes da localidade.

Para suportar programação multiplataforma, a classe RuntimeInformation permite-te detetar em que sistema operativo o teu código está a ser executado: Linux, Windows ou OSX.

Instruções

Neste exercício voltas ao mundo dos salões (apresentado pela primeira vez no exercício datetimes). Tal como aconteceu com vários dos teus projetos, outro dos teus clientes teve um enorme sucesso e abriu lojas em Londres e Paris, além da sua base em Nova Iorque.

1. Fornece aos administradores os equivalentes em hora local das marcações em UTC (Tempo Universal Coordenado)

Implementa o método estático Appointment.ShowLocalTime(), que recebe uma hora em UTC e a devolve como hora local.

// For a student in NY
Appointment.ShowLocalTime(new DateTime(2030, 7, 25, 13, 45, 0));
// => {2030, 7, 25, 8, 45, 0}

2. Agenda marcações em Nova Iorque, Londres e Paris

Os salões são responsáveis por fazer as suas próprias marcações. A hora introduzida é local em relação à localização do salão. Por exemplo, se alguém introduzir uma hora de 13:45 para uma marcação no salão de Nova Iorque, espera que o cliente apareça logo depois do almoço. Da mesma forma, se alguém introduzir uma hora de 13:45 para o salão de Londres, também espera que o cliente chegue logo depois do almoço.

Vai ajudar-te saber o identificador do fuso horário de Nova Iorque, Londres e Paris.

No Mac (OSX) e no Linux, são estes:

  • Nova Iorque - America/New_York
  • Londres - Europe/London
  • Paris - Europe/Paris

No Windows, são estes:

  • Nova Iorque - Eastern Standard Time
  • Londres - GMT Standard Time
  • Paris - W. Europe Standard Time

Implementa a sobrecarga estática Appointment.Schedule(), que recebe uma localização e uma string de hora e devolve a hora em UTC da marcação.

A implementação de Schedule() terá de permitir que o código, depois de compilado, corra em Linux, Windows e Mac. Este é o primeiro exercício em que tens de te preocupar com o sistema operativo. Vai ser necessário ter caminhos de código separados para acomodar a diferença nos identificadores de fuso horário descrita acima.

As strings de data e hora introduzidas são garantidamente válidas.

Appointment.Schedule("7/25/2030 13:45:00", Location.Paris);
// => {2030, 7, 25, 11, 45, 0}

3. Envia alertas aos clientes com intervalos antes da marcação

Implementa o método estático Appointment.GetAlertTime() para enviar alertas 1 dia (early), 1 hora e 45 minutos (standard) e 30 minutos (late) antes da marcação.

Appointment.GetAlertTime(new DateTime(2030, 7, 25, 14, 45, 0), AlertLevel.Early);
// => {2030, 7, 24, 14, 45, 0}

4. Se o horário de verão mudou recentemente, enviamos uma mensagem a lembrar os clientes

Implementa o método estático Appointment.HasDaylightSavingChanged() para devolver true se o horário de verão ficou ativo ou inativo nos últimos 7 dias.

Appointment.HasDaylightSavingChanged(new DateTime(2020, 3, 30, 14, 45, 0), Location.London);
// => true

5. Usa o formato de data e hora local para introduzir marcações

Para que as marcações possam ser feitas num formato familiar para a equipa local, foi-te pedido que criasses uma rotina experimental que permita introduzir datas e horas no formato predefinido da localização do salão.

Implementa o método Appointment.NormalizeDateTime(), que recebe uma string de data e hora bem formada num formato adequado à localização e a converte num objeto DateTime. Não se tenta converter a data e hora para UTC.

Se for introduzido um formato inválido, deve ser devolvido um DateTime com o valor 1/1/1.

Appointment.NormalizeDateTime("25/11/2019 13:45:00", Location.London);
// => {2019, 11, 25, 13, 45, 0}
Appointment.NormalizeDateTime("25/11/2019 13:45:00", Location.NewYork);
// => {1, 1, 1, 0, 0, 0}
Editar via GitHub A ligação abre numa nova janela ou separador
C# Exercism

Estás pronto para começar O salão de beleza torna-se global?

Inscreve-te no Exercism para aprenderes e dominares C# com 62 conceitos178 exercícios, e mentoria humana real, tudo grátis.