Показать сообщение отдельно
Старый 03.11.2017, 12:41   #296  
Slava Chernenko is offline
Slava Chernenko
Участник
Самостоятельные клиенты AX
Соотечественники
 
34 / 15 (0) ++
Регистрация: 30.04.2008
Адрес: Copenhagen, Denmark
Вань, это текущая версия кода или твой фикс?

В 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

Последний раз редактировалось Slava Chernenko; 03.11.2017 в 13:25.