time 개념은 .NET에서 DateTime 구조체를 사용해 다뤄요. 로컬 시간과 UTC 사이를 변환하는 루틴도 있어요. 산술 연산은 TimeSpan의 도움을 받아 수행할 수 있어요.
TimeZoneInfo 클래스는 시간대 간의 차이를 다루는 루틴을 제공해요. TimeZoneInfo 클래스에는 일광 절약 시간을 다루는 데 도움이 되는 메서드도 들어 있어요.
CultureInfo 클래스는 로캘에 따라 달라지는 날짜 및 시간 형식을 지원해요.
크로스 플랫폼 코딩을 지원하기 위해 RuntimeInformation 클래스를 사용하면 코드가 어느 운영체제에서 실행되는지, 즉 Linux, Windows 또는 OSX인지 알아낼 수 있어요.
이 연습 문제에서는 살롱의 세계로 다시 돌아와요 (처음 소개된 것은 datetimes 연습 문제였죠). 여러 프로젝트에서 그랬듯이, 또 다른 고객이 큰 성공을 거두고 뉴욕 본점 외에도 런던과 파리에 지점을 열었어요.
UTC 시간을 받아 현지 시간으로 반환하는 정적 Appointment.ShowLocalTime() 메서드를 구현해요.
// For a student in NY
Appointment.ShowLocalTime(new DateTime(2030, 7, 25, 13, 45, 0));
// => {2030, 7, 25, 8, 45, 0}
살롱은 각자 예약을 받아요. 입력하는 시간은 살롱이 있는 위치의 현지 시간이에요. 예를 들어, 뉴욕 살롱에 약속 시간으로 13:45를 입력하면 고객이 점심 직후에 올 것이라고 기대해요. 마찬가지로 런던 살롱에 13:45를 입력해도 고객이 점심 직후에 도착할 것이라고 기대하죠.
뉴욕, 런던, 파리의 시간대 id를 알아 두면 도움이 돼요.
Mac(OSX)과 Linux에서는 다음과 같아요:
Windows에서는 다음과 같아요:
위치와 시간 문자열을 받아 약속의 UTC 시간을 반환하는 정적 Appointment.Schedule() 오버로드를 구현해요.
Schedule() 구현은 한 번 빌드된 코드가 Linux, Windows, Mac에서 실행될 수 있게 해야 해요. 운영 체제를 신경 써야 하는 첫 연습 문제예요. 위에서 설명한 시간대 id의 차이를 수용하려면 별도의 코드 경로가 필요해요.
입력하는 날짜 및 시간 문자열은 유효하다고 보장돼요.
Appointment.Schedule("7/25/2030 13:45:00", Location.Paris);
// => {2030, 7, 25, 11, 45, 0}
약속 전 1일(이른 알림), 1시간 45분(표준 알림), 30분(늦은 알림)에 알림을 제공하는 정적 Appointment.GetAlertTime()을 구현해요.
Appointment.GetAlertTime(new DateTime(2030, 7, 25, 14, 45, 0), AlertLevel.Early);
// => {2030, 7, 24, 14, 45, 0}
지난 7일 동안 일광 절약 시간이 활성화되거나 비활성화되었다면 true를 반환하는 정적 Appointment.HasDaylightSavingChanged()를 구현해요.
Appointment.HasDaylightSavingChanged(new DateTime(2020, 3, 30, 14, 45, 0), Location.London);
// => true
현지 직원에게 익숙한 형식으로 약속을 잡을 수 있도록, 살롱이 있는 위치의 기본 형식으로 날짜와 시간을 입력할 수 있게 하는 실험적인 루틴을 만들라는 임무를 받았어요.
해당 위치에 적합한 형식의 올바른 날짜 및 시간 문자열을 받아 DateTime 객체로 변환하는 Appointment.NormalizeDateTime() 메서드를 구현해요. 날짜 및 시간을 UTC로 변환하려는 시도는 하지 않아요.
잘못된 형식을 입력하면 값이 1/1/1인 DateTime을 반환해야 해요.
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}
Exercism에 가입하고 C# 트랙을 개념 62개연습 문제 178개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.