|
02.11.2017, 20:52 | #1 |
Участник
|
X++: static void yearDiff_test(Args _args) {; // AX 2009 5.0.1500.4570 info(strfmt('%1', yearDiff(28\2\2017, 28\2\1976))); // returns 41 - OK info(strfmt('%1', yearDiff(1\3\2017, 29\2\1976))); // returns 41 - OK info(strfmt('%1', yearDiff(28\2\2017, 29\2\1976))); // returns 40 - arguable info(strfmt('%1', yearDiff(1\3\2017, 1\3\1976))); // returns 40 - wtf? info(strfmt('%1', yearDiff(2\3\2117, 1\3\1976))); // returns 140 - WTF!? } |
|
03.11.2017, 00:23 | #2 |
Участник
|
Цитата:
Сообщение от Slava Chernenko
X++: static void yearDiff_test(Args _args) {; // AX 2009 5.0.1500.4570 info(strfmt('%1', yearDiff(28\2\2017, 28\2\1976))); // returns 41 - OK info(strfmt('%1', yearDiff(1\3\2017, 29\2\1976))); // returns 41 - OK info(strfmt('%1', yearDiff(28\2\2017, 29\2\1976))); // returns 40 - arguable info(strfmt('%1', yearDiff(1\3\2017, 1\3\1976))); // returns 40 - wtf? info(strfmt('%1', yearDiff(2\3\2117, 1\3\1976))); // returns 140 - WTF!? } X++: static int yearDiff(date d1, date d2) { date boundary; int offset; if ( d1 < d2) { boundary = mkDate(dayOfMth(d1), mthOfYr(d1), year(d2)); offset = (d2 - boundary) < 0 ? -1 : 0; } else { boundary = mkDate(dayOfMth(d2), mthOfYr(d2), year(d1)); offset = (d1 - boundary) < 0 ? 1 : 0; } return year(d1) - year (d2) - offset ; } |
|
03.11.2017, 12:41 | #3 |
Участник
|
Вань, это текущая версия кода или твой фикс?
В 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); } в результате код работает конечно намного лучше кода из 2009, но: - использование недокументированого поведения функции mkdate - 29 февраля приравнивается к 28 февраля в невисокосных годах, что отличается от старого поведения и к тому же вопрос использования 28 февраля vs 1 марта как даты соответствующей 29 февраля в невисокосных годах по-разному урегулирован в разных странах https://en.wikipedia.org/wiki/February_29 Последний раз редактировалось Slava Chernenko; 03.11.2017 в 13:25. |
|
03.11.2017, 23:59 | #4 |
Участник
|
Цитата:
Сообщение от 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); } в результате код работает конечно намного лучше кода из 2009, но: - использование недокументированого поведения функции mkdate - 29 февраля приравнивается к 28 февраля в невисокосных годах, что отличается от старого поведения и к тому же вопрос использования 28 февраля vs 1 марта как даты соответствующей 29 февраля в невисокосных годах по-разному урегулирован в разных странах https://en.wikipedia.org/wiki/February_29 |
|