Поняття часу в .NET опрацьовується за допомогою структури DateTime. Існують процедури для перетворення між місцевим часом і UTC. Арифметичні дії можна виконувати за допомогою TimeSpan.
Клас TimeZoneInfo надає процедури для роботи з різницею між часовими поясами. Клас TimeZoneInfo також містить методи, які спрощують роботу з переходом на літній час.
Клас CultureInfo підтримує формати дати й часу, залежні від локалі.
Щоб підтримувати написання кросплатформного коду, клас RuntimeInformation дає змогу визначити, в якій операційній системі виконується код: Linux, Windows чи OSX.
У цій вправі ми знову повертаємося у світ салонів (уперше він зʼявився у вправі datetimes). Як і з низкою наших проєктів, ще один наш клієнт досяг великого успіху й відкрив філії в Лондоні та Парижі на додачу до своєї бази в Нью-Йорку.
Реалізуйте статичний метод Appointment.ShowLocalTime(), який приймає час у UTC і повертає його як місцевий час
// 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 для лондонського салону, теж очікують, що клієнт прийде одразу після обіду.
Нам стане в пригоді знання ідентифікаторів часових поясів для Нью-Йорка, Лондона і Парижа.
На Mac (OSX) і Linux вони такі:
У Windows вони такі:
Реалізуйте статичне перевантаження Appointment.Schedule(), яке приймає локацію та рядок тексту (англ. string) з часом і повертає час запису в UTC.
Реалізація Schedule() повинна дозволяти запускати зібраний код на Linux, Windows і Mac. Це перша вправа, у якій нам потрібно зважати на операційну систему. Потрібно буде мати окремі шляхи виконання коду, щоб урахувати різницю в ідентифікаторах часових поясів, описану вище.
Гарантовано, що вхідні рядки тексту з датою й часом коректні.
Appointment.Schedule("7/25/2030 13:45:00", Location.Paris);
// => {2030, 7, 25, 11, 45, 0}
Реалізуйте статичний метод Appointment.GetAlertTime(), щоб надсилати нагадування за 1 день (завчасно), 1 годину 45 хвилин (стандартно) і 30 хвилин (пізно) до запису.
Appointment.GetAlertTime(new DateTime(2030, 7, 25, 14, 45, 0), AlertLevel.Early);
// => {2030, 7, 24, 14, 45, 0}
Реалізуйте статичний метод Appointment.HasDaylightSavingChanged(), який повертає true, якщо літній час став активним або неактивним за останні 7 днів.
Appointment.HasDaylightSavingChanged(new DateTime(2020, 3, 30, 14, 45, 0), Location.London);
// => true
Щоб записи можна було робити у форматі, звичному для місцевого персоналу, нам доручили створити експериментальну процедуру, яка дозволяє вводити дати й час у типовому форматі для розташування салону.
Реалізуйте метод Appointment.NormalizeDateTime(), який приймає коректно оформлений рядок тексту з датою й часом у форматі, що відповідає локації, і перетворює його на обʼєкт DateTime. Спроби перетворити дату й час на UTC не робляться.
Якщо введено неправильний формат, потрібно повернути DateTime зі значенням 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}
Зареєструйтеся на Exercism, щоб вивчати й опановувати C#, а також 62 концепції178 вправ та справжнє наставництво від людей, і все це безкоштовно.