09.03.2011, 12:21 | #1 |
Участник
|
Баг или "пророчество"
Функция WeekOfYear(31\12\2012) возвращает 2
наверное после дня апокалипсиса нумерация недель начинается заново. |
|
09.03.2011, 12:29 | #2 |
Участник
|
красота:
X++: print(weekofYear(30\12\2012)); // 53 print(weekofYear(31\12\2012)); // 2 print(weekofYear(01\01\2013)); // 1 |
|
09.03.2011, 12:38 | #3 |
Модератор
|
Еще интереснее:
X++: info(strfmt("d3:%1",WeekOfYear(21\12\2012))); //52 info(strfmt("d4:%1",WeekOfYear(30\12\2012))); //53 Вау! Да класс global рулит! static int weekOfYear(date _curDate) Цитата:
// The dayofwk function used above returns
// the ISO-8601 day of week, where Monday is 1 // and recall that the 1 was subtracted from the result // to get a value between (0 - 6). // // If the locale settings (firstDayOfWeek) is // not Monay (i.e. > 0) then the caclulated // day of week results need to be adjusted // so they align with the locale setting. А толку-то... С Уважением, Георгий |
|
|
За это сообщение автора поблагодарили: mifi (-1). |
09.03.2011, 12:54 | #4 |
Microsoft Dynamics
|
Хотя между 21 и 30 и больше 7 дней, но 21.12.2012 - пятница, 30.12.2012 - воскресенье. Что не так-то? Вроде бы нормально, что между одним днем одной недели и другим днем следующей недели не 7 дней..
|
|
09.03.2011, 13:03 | #5 |
Участник
|
Это майя дали человечеству еще один день, чтобы оттянуться напоследок на Новый год. Чтобы президент в своей последней речи попросил у всех прощения. И т.п.
|
|
09.03.2011, 13:59 | #6 |
Участник
|
|
|
09.03.2011, 13:59 | #7 |
Модератор
|
Цитата:
X++: static void Job17(Args _args) { ; info(strfmt("25.12.2011 - %1",WeekOfYear(25\12\2011))); //52 info(strfmt("30.12.2011 - %1",WeekOfYear(30\12\2011))); //1 info(strfmt("31.12.2011 - %1",WeekOfYear(31\12\2011))); //1 info(strfmt("01.01.2012 - %1",WeekOfYear(01\01\2012))); //1 info(strfmt("29.12.2012 - %1",WeekOfYear(29\12\2012))); //53 info(strfmt("30.12.2012 - %1",WeekOfYear(30\12\2012))); //53 info(strfmt("31.12.2012 - %1",WeekOfYear(31\12\2012))); //1 info(strfmt("01.01.2013 - %1",WeekOfYear(01\01\2013))); //1 } Код: Info Сообщение (13:48:46) 25.12.2011 - 52 Info Сообщение (13:48:46) 30.12.2011 - 1 Info Сообщение (13:48:46) 31.12.2011 - 1 Info Сообщение (13:48:46) 01.01.2012 - 1 Info Сообщение (13:48:46) 29.12.2012 - 53 Info Сообщение (13:48:46) 30.12.2012 - 53 Info Сообщение (13:48:46) 31.12.2012 - 1 Info Сообщение (13:48:46) 01.01.2013 - 1 но, есть разночтения с SQL: PHP код:
Код: 25/12/2011 30/12/2011 31/12/2011 01/01/2012 ----------- ----------- ----------- ----------- 52 53 53 1 (1 row(s) affected) 30/12/2012 31/12/2012 01/01/2013 ----------- ----------- ----------- 53 54 1 (1 row(s) affected) -------------------------------------------------------------------------------------------------------------------------------- Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Intel X86) Apr 2 2010 15:53:02 Copyright (c) Microsoft Corporation Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2) (Hypervisor)
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
09.03.2011, 14:01 | #8 |
Модератор
|
Да, в 2009 возвращает 1. Я свои примеры тоже с 2009 брал.
С Уважением, Георгий |
|
09.03.2011, 14:13 | #9 |
Модератор
|
Да, именно поэтому в самой последней версии DAX 31.12.2012 - это 1я рабочая неделя.
|
|
09.03.2011, 14:21 | #10 |
Участник
|
Не верно отрабатывает функция wkofyr(_date), которая вызывается из weekofyear.
__________________
В подводной охоте главное вдох ... |
|
09.03.2011, 14:34 | #11 |
Axapta
|
Майя тут ни при чем. Например:
X++: info(strfmt("%1",WeekOfYear(31\12\1928))); // Ax 3.0, 4.0: 2. Ax 2009: 1 info(strfmt("%1",WeekOfYear(31\12\1956))); // Ax 3.0, 4.0: 2. Ax 2009: 1 info(strfmt("%1",WeekOfYear(31\12\1984))); // Ax 3.0, 4.0: 2. Ax 2009: 1 info(strfmt("%1",WeekOfYear(31\12\2040))); // Ax 3.0, 4.0: 2. Ax 2009: 1 info(strfmt("%1",WeekOfYear(31\12\2001))); //1 info(strfmt("%1",WeekOfYear(30\12\2003))); //1 info(strfmt("%1",WeekOfYear(29\12\2008))); //1 |
|
10.03.2011, 12:28 | #12 |
Модератор
|
Несмотря на все протесты Mifi, функция работает некорректно. Никакие это ни майя - очередная бага, вернее, их скопище, которые лежат еще с 3ки, если не раньше.
Да, wkofyr(_date) - работает некорректно. Но для этого и был написан пафосный класс-обертка weekOfYear(), который учитывает локальные настройки, в частности, с какого дня начинается неделя, но при этом при формировании тестовой даты не учитывает, что год может быть високосным Ошибка возникает здесь, как я говорил: X++: if (week > 52) { // Look at the last day of the week and compare it // to the target date. If the year is different // then the target date is part of week 1 for next year. testDate = _curDate + ((#DaysPerWeek - 1) - dowCurDate); //Ошибка Ладно, хорошо. Может, в мире и не так. Тогда надо учитывать, что каждый 4й год происходит такая беда как високосный год, и testDate формируется некорректно. С Уважением, Георгий |
|
10.03.2011, 12:58 | #13 |
Участник
|
А при чём тут високосный год? testDate формируется с одной лишь целью - узнать на какой год попадает конец недели. В случае если неделя начинается в одном году а коньчается в другом, то ей присваивают первый номер! Зачем это сделано? Наверное для того чтобы дни одной и той же недели с понедельника по воскресенье всегда оказывались в одном номере недели.
|
|
10.03.2011, 13:07 | #14 |
Модератор
|
Цитата:
Да вот сам в шоке. Наверное, что бы понять, если последняя неделя года приходится с переходом на другой год, то дать ей номер 1? Цитата:
С Уважением, Георгий |
|
10.03.2011, 13:35 | #15 |
Участник
|
Цитата:
X++: testDate = _curDate + ((#DaysPerWeek - 1) - dowCurDate); Т.е. дата testDate не попадала на воскресенье? Мне это воспроизвести не удалось. |
|
10.03.2011, 14:10 | #16 |
Модератор
|
Так. Стоп.
1. Вы согласны, что приведенная функция работает некорректно? Или Вы считаете, что 27.12.10 - , 26.12.11 - , 24-30.12.12 - это 1 рабочая неделя?? 2. Если Вы согласны, что это не так, что это 53 недели в году, тогда идем дальше. Вы согласны, что ошибка возникает именно в методе WeekOfYear? 3. Вы согласны, что они возникает именно при первой проверке if (week > 52)? Итак, если Вы согласны, то осталось понять, а как исправить функцию, что бы она возвращала корректные значения для России. Этого можно добиться, исключив данную проверку (для России). Рассматривать расчет testDate, как Вы уже указали, некорректно, так как цель данного расчет - это посмотреть, не переходит ли неделя через год и сбросить счетчик текущей недели. Согласны? Или есть какие-либо подводные камни, которые я не учел? С Уважением, Георгий |
|
10.03.2011, 14:31 | #17 |
Участник
|
Цитата:
Цитата:
P.S.: И ещё, чтобы не вводить никого в заблуждение, мы же говорим не о рабочих неделях, а о календарных. В том смысле, что праздничные дни никак на результат не влияют Последний раз редактировалось S.Kuskov; 10.03.2011 в 14:33. |
|
10.03.2011, 14:47 | #18 |
Axapta
|
Не согласен. Некорректно в каком случае? В стандартной Аксапте она используется только для отображения номера недели в форме SysDateLookUp. И в этом контексте выглядит все логично.
А если кто-то будет использовать данную функцию в ином контексте, не разобравшись в принципе ее работы, посмотрев только на название, то он сам себе злобный буратино. Хотя да, могли бы в методе сверху написать об "особенности" определения номера недели в конце года, чтобы не было соблазна воспользоваться ей в неподобающем месте. |
|
|
За это сообщение автора поблагодарили: George Nordic (1), S.Kuskov (1). |
10.03.2011, 16:21 | #19 |
Модератор
|
Цитата:
Цитата:
Цитата:
Сообщение от oip
А если кто-то будет использовать данную функцию в ином контексте, не разобравшись в принципе ее работы, посмотрев только на название, то он сам себе злобный буратино. Хотя да, могли бы в методе сверху написать об "особенности" определения номера недели в конце года, чтобы не было соблазна воспользоваться ей в неподобающем месте.
С Уважением, Георгий |
|
12.03.2011, 22:27 | #20 |
Участник
|
Если учитывать, что в DAX2009 серьезно переписали подсистему работы с датами, то удивляться различию между DAX4 (и Ax3.0) и DAX2009 в результатах в общем-то не стоит (например, метод firstWeekOfYear класса Global полностью переписан на использование NET, поэтому в DAX2009 работает общая логика Win, а не особенности Ax).
Ну, и тем более, влияет серьезное изменение метода weekOfYear того же класса Global. Последний раз редактировалось Raven Melancholic; 12.03.2011 в 22:40. |
|