Поведение DateTime.AddYears в високосный год

Может ли кто-нибудь объяснить математические или просто причины вычислений високосного года в .NET при использовании метода AddYears в DateTime?

  • Если вы возьмите 29 февраля 2012 г. и добавьте год, вы получите 28 февраля 2013 г., а не 1 марта 2013 г. (день раньше, на год позже).
  • Если вы прибавите один год к 31 января 2012 года, вы получите 31 января 2013 года (та же дата на год позже).

Я думаю, что большинство людей предположит, что «один год с 29.02.leapX равен 01.03.leapX + 1».

Пример:

// Testing with 29th Feb
var now1 = DateTime.Parse("2012-02-29 15:00:00");

var results1 = new DateTime[]
{
    now1.AddYears(1),
    now1.AddYears(2),
    now1.AddYears(3),
    now1.AddYears(4)
};

foreach(var dt in results1)
{
    Console.WriteLine(dt.ToString("s"));
}

// Output:
// 2013-02-28T15:00:00
// 2014-02-28T15:00:00
// 2015-02-28T15:00:00
// 2016-02-29T15:00:00


// Testing with 31st Jan
var now2 = DateTime.Parse("2012-01-31 13:00:00");

var results2 = new DateTime[]
{
    now2.AddYears(1),
    now2.AddYears(2),
    now2.AddYears(3),
    now2.AddYears(4)
};

foreach(var dt in results2)
{
    Console.WriteLine(dt.ToString("s"));
}

// Output:
// 2013-01-31T13:00:00
// 2014-01-31T13:00:00
// 2015-01-31T13:00:00
// 2016-01-31T13:00:00
14
задан Henrik 29 February 2012 в 11:27
поделиться