Сообщение от
Slava Chernenko
Вань, это текущая версия кода или твой фикс?
В 2009 код был таким - как часто бывает кто-то пытался быть слишком смарт:
X++:
static int yearDiff(date d1, date d2)
{
int daysDiff = d1 - d2 - 1;
if (daysDiff >= 0)
return year(num2date(daysDiff)) - 1900;
else
return -1 * (year(num2date(-1 * daysDiff)) - 1900);
}
PS: в новом/твоем коде используется недокументированный эффект mkdate() обрезать день месяца из диапазона 29-31 до последнего дня месяца - mkdate(31,2,2017) дает 28/2/2017 хотя по документации должен бы был вернуть 1/1/1900 "If the date is not valid, this method returns a zero date."
в результате код работает конечно намного лучше кода из 2009, но:
- использование недокументированого поведения функции mkdate
- 29 февраля приравнивается к 28 февраля в невисокосных годах, что отличается от старого поведения и к тому же вопрос использования 28 февраля vs 1 марта как даты соответствующей 29 февраля в невисокосных годах по-разному урегулирован в разных странах
https://en.wikipedia.org/wiki/February_29