Почему столько головной боли из-за перехода на летнее время на 2 недели раньше
Как известно в США и в нескольких других странах решили перейти на летнее время на две недели раньше в этом году.
Казалось бы даты и времена в большинстве современного программного обеспечения хранятся в UTC и это вроде как гарантирует, что независимо от временной зоны, летнего или зимнего времени это событие произойдет в одно и то же время. Но проблема в том, что люди не пользуются UTC, люди пользуются локальным временем. Самолет улетает в 10 часов утра - значит самолет улетает в 10 часов утра локального времени. И когда переводят часы на час вперед, самолет по прежнему вылетает в 10 часов локального времени, но это уже будет другой UTC. Сохраненное в UTC время сложно подправить, потому что неизвестно было ли оно посчитано с учетом перехода на летнее время или нет.
Вот небольшая программка на C#, которая демонстрирует проблему:
DateTime dateTime = new DateTime(2007, 03, 12, 14, 0, 0);
Console.WriteLine("Before conversion: {0}", dateTime.TimeOfDay);
dateTime = dateTime.AddDays(-10).ToUniversalTime().AddDays(10).ToLocalTime();
Console.WriteLine("After conversion: {0}", dateTime.TimeOfDay);
Программку надо запускать в тихоокеанской временной зоне. В другой временной зоне надо установить начальную дату на следующий день за днем перехода на летнее время.