Я столкнулся с високосным годом в DateTime
обработке .NET, в частности ToLocalTime()
. Вот некоторый код, который воспроизводит проблему (я нахожусь в тихоокеанском часовом поясе):
DateTime dtStartLocal = DateTime.Parse("2009-02-28T23:00:00.0-08:00");
DateTime dtEndLocal = dtStartLocal.AddYears(3);
DateTime dtStartUtc = dtStartLocal.ToUniversalTime();
DateTime dtEndUtc = dtStartUtc.AddYears(3);
DateTime dtEndLocal2 = dtEndUtc.ToLocalTime();
DateTime dtStartLocal2 = dtStartUtc.ToLocalTime();
Console.WriteLine("START: 1={0}, 2={0}", dtStartLocal, dtStartLocal2);
Console.WriteLine("END : 1={0}, 2={1}", dtEndLocal, dtEndLocal2);
Console.ReadLine();
Вывод:
СТАРТ: 1 = 2/28/2009 23:00:00 PM, 2 = 2/28/2009 11:00:00
КОНЕЦ: 1 = 2/28/2012 23:00:00 PM, 2 = 2/29/2012 23:00:00
Обратите внимание, что переменная, которую я сделал ToUniversalTime().AddYears(3).ToLocalTime()
, отличается от простой AddYears(3)
, она впереди на один день.
Кто-нибудь сталкивался с этим? Если это ожидается, может кто-нибудь объяснить логику этого?
ПРИМЕЧАНИЕ. Да, лучший подход - полностью работать в формате UTC, а не переключаться между ними. Это не то, что влияет на меня, а особенность, с которой я столкнулся. По сути, я неправильно понял, как работает AddYears()
, и теперь я понимаю, почему он делает то, что делает (см. Мой выбранный ответ ниже).