Показать сообщение отдельно
Старый 03.11.2017, 23:59   #297  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от 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
Это текущий код.