Обсуждение:Как узнать день недели
0 (0)
Обсуждение:Как узнать день недели ( Обсуждение примера 28.08.2005 09:06 )
2(1)Короткий пример с использованием WSH. Не нашел в системной библиотеке Календарь функций определения дня недели, пришлось искать выход.
Посмотреть пример
>> ОтветитьВсё проще ;) ( Pov 30.08.2005 12:55 )
0(0)Как пример использования WSH - да, не спорю. А для решения задачи определения дня недели - всё проще:
macro GetWeekDay(dat) days = dat - date(3,1,1999); weeks = int(floor(days / 7.0)); return days - weeks * 7; end;
>> ОтветитьКак все гениальное.. ( Izmajlov 30.08.2005 13:38 )
2(1)Чем больше разных способов - тем лучше
>> ОтветитьМожно еще проще (+) ( Александр 02.09.2005 03:46 )
2(1)Mod( Int( {curdate} ),7 );
>> ОтветитьШайтан :-) ( Pov 02.09.2005 08:44 )
0(0)Да, лихо, ничего не скажешь :)
>> ОтветитьДолго сомневался - продолжать ли обсуждение? ( Izmajlov 14.09.2005 15:59 )
0(0)Действительно, тот пример (определение дня недели) был не совсем адекватен задаче. Простое и изящное решение нашлось. Но у меня не выходила из головы мысль, что этот пример важен не как определение дня, а как механизм задействования практически всей мощи WSH.
И вот тут подвернулась еще одна задачка, я ее решил все тем же способом. Как умею, так и решил. Может кто подкинет решение на RSL?
Определить количество месяцев (любых интервалов) между двумя датами.
Вот решение с помощью WSH
Import rslx, lgxs; DateStart = Date(21,8,2003); DateEnd = {curdate}; if(not getDate(DateStart,"Дата начала периода")) exit(1); end; if(not getDate(DateEnd,"Дата окончания периода")) exit(1); end; if(IsStandAlone()) obj=ActiveX("MSScriptControl.ScriptControl"); else obj=TlgActiveX("MSScriptControl.ScriptControl",true); end; obj.language = "VBscript"; arg = "DateDiff(\x22m\x22,DateValue(\x22"+String(DateStart)+"\x22),DateValue(\x22"+String(DateEnd)+"\x22))"; monts = obj.eval(arg);
С уважением,
Измайлов Ф.В.
>> ОтветитьЕсли в лоб - то так ( Pov 15.09.2005 10:10 )
0(0)var month_S, year_S, month_E, year_E; datesplit(DateStart,null,month_S,year_S); datesplit(DateEND,null,month_E,year_E); monts = (year_E - year_S) * 12 + month_E - month_S;
Так побыстрее будет. Я покрутил в цикле из 10000 проходов твой пример - 50 секунд :( Мой - меньше секунды. Если использовать функцию в серьёзном отчёте это может стать решающим фактором.
Александр, Ваш выход ! ;-)
>> ОтветитьЭто не в лоб, это изящно :)) ( Izmajlov 15.09.2005 12:20 )
0(0)Мне понравился алгоритм. Уже отвык на РСЛ-е такие выверты делать. Признаю, все красиво.
Два замечания.
1. Моя задача была определить количество месяцев один раз, и уже цикл по количеству строить. Сравнение быстродействия конечно не сторону WSH, это понятно.
2. Мой алгоритм позволяет определять интервалы - года, кварталы, месяцы,недели, дни, минуты, секунды - заменой одного символа. Под каждый интервал, при реализации на РСЛ придется свой алгоритм придумывать. Впрочем, это хорошо. адо вообще такие примеры выкладывать в копилку алгоритмов, или примеров, как угодно. Наверняка, кому-нибуть обязательно понадобится, и незачем будет изобретать велосипед. Это я к слову о том, что я не против РСЛ, а за разноообразие реализаций задач.
С уважением,
Измайлов Ф.В.
>> ОтветитьВсем титанам мысли привет! И бог в помощь :) ( Головин Леонид 15.09.2005 12:51 )
0(0)А я вообще рад что в копилке RSL развернулись такие соревнования Титанов :)
Согласен с Феликсом - что любой пример будет востребован.
Более того мелкие фичи, программисткие этюды - легче читаются, проще встраиваются в разные конфигурации, повторяются, модифицируются.
Поэтому - хорошо бы чтобы здесь почаще возбуждались подобные случаи обмена идеями инструментами и т.п.
>> Ответить
здесь есть подводные камни.... ( Sandy 15.09.2005 16:45 )
5(1)если требуется учитывать полные/неполные месяцы/годы
Пример:
DateStart=31/12/2004 -> monthS=12 yearS=2004
DateEnd =01/01/2005 -> monthE=1 yearS=2005
monts=(2005-2004)*12+1-12=12+1-12=1
DateStart=01/01/2005 -> monthS=1 yearS=2005
DateEnd =30/12/2005 -> monthE=12 yearS=2005
monts=(2005-2005)*12+12-1=0+12-1=11
А разве это так?
Похожий пример делал для подсчета стажа (лет, месяцев, дне), но не в RSL, а в Excel.
DateStart в B2
DateEnd в B3
Полных лет (С6) =ЕСЛИ(ДАТА(ГОД(B3);МЕСЯЦ(B2);ДЕНЬ(B2))>B3;ГОД(B3)-ГОД(B2)-1;ГОД(B3)-ГОД(B2))
Полных мес (С7) =ЕСЛИ(ДАТА(ГОД(B3);МЕСЯЦ(B2);ДЕНЬ(B2))>B3;ЕСЛИ(ДЕНЬ(B3)<ДЕНЬ(B2);МЕСЯЦ(B3)-МЕСЯЦ(B2)+11;МЕСЯЦ(B3)-МЕСЯЦ(B2)+12);ЕСЛИ(ДЕНЬ(B3)<ДЕНЬ(B2);МЕСЯЦ(B3)-МЕСЯЦ(B2)-1;МЕСЯЦ(B3)-МЕСЯЦ(B2)))
Дней =B3-ДАТАМЕС(B2;C6*12+C7)
желающие могут перевести в RSL :)
>> ОтветитьПодводные камни ... ( Izmajlov 15.09.2005 17:14 )
0(0)Я ставил (перед собой) задачу определить количество месяцев, а уж полные они или не полные определялось через переменные (к примеру DateSplit(DateStart,dd1,mm1,yy1))
Предположим
DateStart=01/01/2005 -> monthS=1 yearS=2005 DateEnd =30/12/2005 -> monthE=12 yearS=2005 monts=(2005-2005)*12+12-1=0+12-1=11 то алгоритм будет все равно правильно работать, т.к. цель прокрутить цикл по количеству месяцев i=0; While(i<=month) // Цикл будет выполняться 12 раз, ведь месяцев действительно 12 if(i==0) D1 = Date(dd,i+1,yy) else D1 = Date(1,i+1,yy); end; if(i==11) D2 = Date(31,12,yy); else D2 = Date(1,i+2,yy)-1; end; println(DebetA(account,D1,D2):a); i=i+1; end;
>> Ответить
Круто, :)) ( Ulan 28.06.2007 06:38 )
0(0)Класс!!!
А то я до этого делал так:
macro GetDayOfWeek(p_Date) var m_ControlDate = Date(1,1,1900); /* должен указывать на понедельник */ return m_DaysOfWeek(Mod(p_Date - m_ControlDate, 7)); end;
>> Ответить