Trilhas
/
C#
C#
/
Exercícios
/
O salão de beleza se globaliza
O salão de beleza se globaliza

O salão de beleza se globaliza

Exercício de aprendizagem

Introdução

Tempo

O conceito de tempo é tratado no .NET usando a estrutura DateTime. Há rotinas para converter entre o horário local e UTC. A aritmética pode ser feita com o auxílio de TimeSpan.

Fuso horário

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

A classe CultureInfo dá suporte a formatos de data e hora dependentes da localidade.

Para dar suporte à programação multiplataforma, a classe RuntimeInformation permite detectar em qual sistema operacional seu código está sendo executado, Linux, Windows ou OSX.

Instruções

Neste exercício, você volta ao mundo dos salões (apresentados pela primeira vez no exercício datetimes). Assim como aconteceu em vários dos seus projetos, outro cliente seu fez muito sucesso e abriu filiais em Londres e Paris, além da base em Nova York.

1. Forneça aos administradores os horários locais equivalentes aos agendamentos em UTC (Tempo Universal Coordenado)

Implemente o método estático Appointment.ShowLocalTime(), que recebe um horário UTC e o retorna como horário local.

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

2. Agende compromissos em Nova York, Londres e Paris

Os salões são responsáveis por marcar seus próprios agendamentos. O horário informado é local em relação à unidade do salão. Por exemplo, se alguém informa um horário de 13:45 para um agendamento no salão de Nova York, espera que o cliente apareça logo depois do almoço. Da mesma forma, se alguém informar 13:45 para o salão de Londres, também espera que o cliente apareça logo depois do almoço.

É bom você saber o ID do fuso horário de Nova York, Londres e Paris.

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

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

No Windows, eles são:

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

Implemente a sobrecarga estática Appointment.Schedule(), que recebe uma localização e uma string de horário e retorna o horário UTC do agendamento.

A implementação de Schedule() precisará permitir que o código, depois de compilado, rode no Linux, no Windows e no Mac. Este é o primeiro exercício em que você precisa se preocupar com o sistema operacional. Será necessário ter caminhos de código separados para acomodar a diferença nos IDs de fuso horário descrita acima.

As strings de data e hora informadas são garantidas como válidas.

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

3. Envie alertas aos clientes em intervalos antes do agendamento

Implemente o método estático Appointment.GetAlertTime() para enviar alertas 1 dia (antecipado), 1 hora e 45 minutos (padrão) e 30 minutos (atrasado) antes do agendamento.

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 aos clientes para lembrá-los.

Implemente o método estático Appointment.HasDaylightSavingChanged() para retornar 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. Use o formato local de data e hora para inserir agendamentos

Para que os agendamentos possam ser feitos em um formato familiar à equipe local, você ficou encarregado de criar uma rotina experimental que permita inserir datas e horas no formato padrão da unidade do salão.

Implemente o método Appointment.NormalizeDateTime(), que recebe uma string de data e hora bem formada em um formato adequado à localização e a converte em um objeto DateTime. Não há nenhuma tentativa de converter a data e hora para UTC.

Se um formato inválido for informado, deve ser retornado 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 O link abre em uma nova janela ou aba
C# Exercism

Tudo pronto para começar O salão de beleza se globaliza?

Crie sua conta no Exercism para aprender e dominar C# com 62 conceitos178 exercícios e mentoria humana de verdade, tudo de graça.