08.07.2009, 19:22 | #1 |
Moderator
|
40 тыщ дней от Microsoft
Ввожу сегодня текущую дату 08.07.2009 в ячейку Excel, а потом случайно сдергиваюсь форматом на General. В ячейке - 40002. Вау! Оказывается понедельник, 06.07.2009, был "в Excel" днём 40000!
Ну, тут же само собой воодушевленный и Аксапточку проверяю: X++: static void Job192(Args _args) { ; box::info(strFmt('%1', date2num(08\07\2009))); } Так что поздравляю всех любителей подобной нумерологии! P.S. Разница в 2 дня чем-то, вроде, объясняется. Но чем именно, я навскидку не помню. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
08.07.2009, 23:13 | #2 |
Участник
|
В Excel дата 00.01.1900 соответствует значению 0 в типе дата, а в Ax - это 01.01.1900. Это первый сдвиг в датах.
А второй объясняется тем, что в Excel 1900 год считается високосным, хотя в действительности (и Ax так и считает) это был невисокосный год. Цитата:
Сообщение от Википедия
Проблемы с датой
В версиях Excel до 2007 включительно 1900 год ошибочно считался високосным. Ошибка возникла в Lotus 1-2-3 и была намеренно внесена в Excel и поддерживалась для обратной совместимости.
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Gustav (2), Roumed (1). |
09.07.2009, 09:46 | #3 |
Moderator
|
Цитата:
Припоминаю похожее обсуждение на эту тему: dateNull() и endMth() P.S. Хм... интересно, что Аксапта, похоже, проверяет литерал даты на корректность не как единую дату, а по отдельности - день, месяц, год. При этом дни считаются корректными в диапазоне от 1 до 31 для ЛЮБОГО (!) месяца. Поэтому становится возможным ввести дату 31 февраля 2009 года. При этом функция date2num возвращает целое значение для ближайшего предыдущего реально существующего дня, т.е. для 28.02.2009. И лишь 32-е февраля наконец-таки вызывает ошибку компиляции: X++: static void Job192(Args _args) { ; info(strFmt('27 - %1', date2num(27\02\2009))); // 39869 info(strFmt('28 - %1', date2num(28\02\2009))); // 39870 info(strFmt('29 - %1', date2num(29\02\2009))); // 39870 -- несуществ. info(strFmt('30 - %1', date2num(30\02\2009))); // 39870 -- несуществ. info(strFmt('31 - %1', date2num(31\02\2009))); // 39870 -- несуществ. //info(strFmt('32 - %1', date2num(32\02\2009))); -- ошибка компиляции info(strFmt('01 - %1', date2num(01\03\2009))); // 39871 } Последний раз редактировалось Gustav; 09.07.2009 в 10:09. |
|
09.07.2009, 10:10 | #4 |
Axapta
|
Цитата:
|
|
09.07.2009, 10:43 | #5 |
Moderator
|
С годами - тоже занятно. Известно, что максимальная дата в Аксапте - это 31\12\2153 (возвращается функцией maxdate). Для этого дня date2num вернет свое максимальное значение: date2num(31\12\2153) = 92771.
Но для любой даты следующего, 2154-го, ошибки не будет. И только если написать в коде 01\01\2155, то возникнет ошибка компиляции с сообщением "Год вышел за пределы 1900-2150" (2150! не 2153, не 2154 ). Обнаружено также, что date2num будет возвращать 0 для любой даты 2154 года (также как и для 1900). P.S. Интересное обсуждение про "недодачу" двух лет для диапазонов было здесь: неккоректная(?) работа функции maxdate() |
|