21.10.2014, 16:11 | #1 |
Участник
|
i-neti: Как, зная неделю года, рассчитать дату понедельника этой недели?
Источник: http://i-neti.ru/blog/231
============== Решение: X++: static TransDate getMondayDateByWeek(Week _week) { TransDate transDate; TransDate firstJanuary = mkDate(1, 1, year(systemDateGet())); int firstDayofWeek = dayOfWk(firstJanuary); int dayOfYear; ; if (_week == 1) return firstJanuary; dayOfYear = 7 - firstDayofWeek + 1 + (7 * (_week - 1)) - 7; transDate = dateStartYr(systemDateGet()) + dayOfYear; return transDate; } Источник: http://i-neti.ru/blog/231
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. Последний раз редактировалось mazzy; 22.10.2014 в 06:34. |
|
22.10.2014, 07:04 | #2 |
Участник
|
чет сложно как-то.
в global есть функции dateStartWeek, dateEndWeek. лучше уж что-нибудь вроде TransDate firstJanuary = mkDate(1, 1, year(systemDateGet())); return dateStartWeek(firstJanuary + (_week * 7)); наверняка, можно сделать код еще короче и понятнее. и уж точно не стоит использовать магию в стиле "7 + ... - 7" Последний раз редактировалось mazzy; 22.10.2014 в 07:07. |
|
|
За это сообщение автора поблагодарили: clerk (1). |
22.10.2014, 07:56 | #3 |
Участник
|
Ага. Я пытался понять логику автора, но до конца у меня это не получилось. Видимо предполагалось вычислять то длинное выражение в несколько этапов:
(7 - firstDayofWeek + 1) это явно длина первой недели. Но дальше уже не все так прозрачно Нужно использовать week-1, если хотим нумеровать недели с единицы, а не с нуля. И ещё я бы вынес год в параметры функции (можно по умолчанию сделать равным текущему). |
|
|
За это сообщение автора поблагодарили: clerk (1). |
22.10.2014, 11:23 | #4 |
Участник
|
Интересно у них 7 таких функций для каждого дня недели в этом году + 7 для прошлого или только "понедельник день тяжелый" ?
|
|
22.10.2014, 12:06 | #5 |
Участник
|
А по какому стандарту вы ищите?)
Я так понимаю, что за первую берете неделю, содержащую 1 января А у нас, в России), действует правило ISO 8601, где первая неделя - это неделя содержащая первый четверг нового года (или 4 января, как проще считать) В общем, код коротким и понятным не получится)
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: gl00mie (2). |
22.10.2014, 12:23 | #6 |
Участник
|
Цитата:
Если неделя большей своей частью принадлежит предыдущему году, то это на самом деле последняя прошлогодняя неделя? Тогда если последняя неделя может заканчиваться в новом году, то первая соответственно может начинаться в прошлом году. Так? |
|
22.10.2014, 13:02 | #7 |
Участник
|
Цитата:
Как пример, 2012-й год. 1 января приходится на воскресенье, соответственно, оно принадлежит 52 неделе 2011 года А первая неделя начинается со 2 января Цитата:
Первая неделя начинается с 30 декабря 2013 года
__________________
Axapta v.3.0 sp5 kr2 |
|
27.10.2014, 11:50 | #8 |
Участник
|
Кстати, аксаптовая функция wkOfYr() возвращает номер недели по ISO 8601
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
27.10.2014, 18:58 | #9 |
MCP
|
Случайно наткнулся - есть похожая Статья
X++: static date Week2Date(int yr, int week) { int weekJan1st; int dayJan1st; date tempDate; #TimeConstants ; weekJan1st = wkofyr(dateStartYr(str2Date(strFmt(%1-01-, yr), 321))); dayJan1st = dayofwk(dateStartYr(str2Date(strFmt(%1-01-, yr), 321))); tempDate = dateStartYr(str2Date(strFmt(%1-01-, yr), 321)); switch(firstWeekOfYear()) { case 0: // Starts on Jan 1 tempDate -= (dayOfWk(tempDate) 1); tempDate += (week 1 ) * 7; break; case 1: // First full week // // If 1st Jan is a monday wkofyr gives correct result // If 1st Jan is a tuesday-thursday wkofyr gives one too much, // as this 4/5/6 day week is given it’s own week number. // if (dayJan1st != 1) tempDate += (8 dayJan1st); tempDate += (week 1) * 7; break; case 2: // First 4-day week if (mthofyr(tempDate) == 1 && weekOfYear(tempDate) > 50) tempDate += week * 7; else tempDate += (week 1) * 7; tempDate -= (dayofwk(tempDate) 1); break; } return tempDate; }
__________________
AXIOMA Последний раз редактировалось kornix; 27.10.2014 в 20:27. |
|
28.10.2014, 01:20 | #10 |
Banned
|
Очень актуально! Кто-нибудь подскажет, как модифицировать код, чтобы получить по номеру недели не дату понедельника, а дату среды? Ничего не получается...
|
|
|
За это сообщение автора поблагодарили: kornix (1). |
28.10.2014, 07:30 | #11 |
Участник
|
Про firstWeekOfYear()
AX 2012 R2: как сменить первый день в календаре? |
|
28.10.2014, 09:27 | #12 |
Участник
|
НачалоНедели(НачалоГода(ТекущаяДата()) +7*60*60*24*количествоНедель) + 60*60*24*3
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
28.10.2014, 09:44 | #13 |
MCP
|
К понедельнику (который научились определять) нужно добавить 2 дня по календарю - будет среда )
__________________
AXIOMA |
|
28.10.2014, 15:40 | #14 |
Banned
|
|
|