Обсуждение:Как узнать день недели

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;
          

          >> Ответить