Имя: Пароль:
IT
 
Простой алгоритм цикла в интервале времени, когда второе значение меньше ?
0 smaharbA
 
07.12.10
12:52
Придумайте попросче
когда конец=07:45:01 начало=19:15:00
без использования даты
нужно только типа

Если (конец > текущее) и (начало < текущее) Тогда

посчитайте просче каков конец будет ?
1 smaharbA
 
07.12.10
12:52
перенесите в адинес
2 palpetrovich
 
07.12.10
12:57
ничего не понимаю(цы)  :)
3 smaharbA
 
07.12.10
12:59
(2) надо определить (как можно просче)
что текущее время входит в интервал (интерес только одни сутки и смежные)

начало=19:15:00
конец=07:45:01
4 Попытка1С
 
07.12.10
13:07
(3) Так можешь числа сравнивать на интервал, не?

191500
74501
5 palpetrovich
 
07.12.10
13:09
+4  тиап так :)
Функция ПолучитьЧисло(текЗнач)
   Возврат Число(СтрЗаменить(текЗнач, ":", ""));
КонецФункции
6 Генератор
 
07.12.10
13:09
время можно привести к секундам с начала суток:
часы*360+минуты*60+секунды
7 Протез
 
07.12.10
13:11
(3)Число 86400 тебе о чем нибудь говорит?
8 Ёпрст
 
гуру
07.12.10
13:12
(3) ну тупо получи время числом - количеством секунд ..и сравнивай с границами.

Хотя, оно и как строка сравнится..

Сообщить(?( (времястрокой <="19:15:00")И(времяСтрокой>=  "07:45:01"),"в нём родимом ","не попадает .."));
9 Fragster
 
гуру
07.12.10
13:12
(0) получай дату в формате юникстайм
10 Протез
 
07.12.10
13:18
Если ТекВремя > 69300 и ТекВремя < 114301 тогда сообщить("попали") Конецесли;
11 smaharbA
 
07.12.10
13:20
(8) внимательно прочел ?
12 smaharbA
 
07.12.10
13:20
(7) ни очем не говорит
13 Ёпрст
 
гуру
07.12.10
13:21
(11) ты про смежные сутки ?
или что ?..
:)
14 smaharbA
 
07.12.10
13:21
(9) так и дурак может
15 jcage
 
07.12.10
13:22
_ВремяНачала = ВремяНачала - НачалоДня(ВремяНачала);
_ВремяКонца = ВремяКонца - НачалоДня(ВремяКонца);

Если _ВремяНачала > _ВремяКонца Тогда
_ВремяКонца = _ВремяКонца + 86400;
КонецЕсли;

Если МИН(_ВремяНачала, ТекВремя) = _ВремяНачала
И МАКС(_ВремяКонца, ТекВремя) = _ВремяКонца Тогда

Сообщить("Входит");

Иначе

Сообщить("Не входит");

КонецЕсли;
16 smaharbA
 
07.12.10
13:22
(13) ага, но все в одном алогитме впихать, без использования перехода дат и без циклов и лишних вычислений, желательно в одном условии
17 Протез
 
07.12.10
13:26
(16) чем (10) не устраивает?
18 trad
 
07.12.10
13:27
Если (ТекущееВремя() > начало) ИЛИ (ТекущееВремя() < конец) Тогда
...
КонецЕсли
19 smaharbA
 
07.12.10
13:29
еще один
20 Протез
 
07.12.10
13:29
(18) Фигня. Где там вхождение в диапазон?
21 smaharbA
 
07.12.10
13:29
пейсатели
22 smaharbA
 
07.12.10
13:30
(20) в (18) один в один с (10)
23 smaharbA
 
07.12.10
13:31
пойду напьюсь, а вы пока поищите
24 Протез
 
07.12.10
13:32
(22) Да ты чо, правда? Между "И" и "ИЛИ" по твоему никакой разницы нет?
25 palpetrovich
 
07.12.10
13:34
млин, только сейчас дошел до меня смысл сабжа :) аааааааааа
26 trad
 
07.12.10
13:34
(23) иди напейся, чейтатель
27 Ненавижу 1С
 
гуру
07.12.10
13:35
начало и конец интервала в виде чего дано? строки числа, датывремени?
28 trad
 
07.12.10
13:35
в (18) частный случай для постановки из (3)

Общий случай:
Начало="19:00:00";
   Конец="7:00:00";
   //Начало="7:00:00";
   //Конец="19:00:00";
   
   Текущее=ТекущееВремя();
   
   Если (Начало>Конец) И ((Текущее > Начало) ИЛИ (Текущее < Конец)) ИЛИ
        (Начало<Конец) И (Текущее > Начало) И (Текущее < Конец) Тогда
       ...
   КонецЕсли
29 palpetrovich
 
07.12.10
13:37
(23) а не означает-ли ситуация когда "конец < началоа" - что это другие сутки априори?

...как понять без даты каким суткам принадлежит конец=07:45:01?
30 Rabbit
 
07.12.10
13:39
"хочешь получить умный ответ - задай умный вопрос"
31 trad
 
07.12.10
13:42
(29)
Постановка задачи говорит о том, что разница между началом и концом не более суток.
И не важно что больше начало или конец.
И еще. Больше - не значит позже.
32 trad
 
07.12.10
13:43
И, естественно, начало всегда раньше конца.
33 Протез
 
07.12.10
13:43
(29) Суток по условию только двое. Даты сравнивай да и всё.
34 zva
 
07.12.10
13:46
Если ( (конец > начала) и (конец > текущее) и (начало < текущее) ) ИЛИ ( ((конец < начала) и ((текущее < конец) или (текущее > начала)) )  Тогда
35 palpetrovich
 
07.12.10
13:47
Функция ПолучитьЧисло(текЗнач)
  Возврат Число(СтрЗаменить(текЗнач, ":", ""));
КонецФункции
//=========================================================  
Процедура Проверить(начало, конец)            
       
   конец = ПолучитьЧисло(конец);
   начало = ПолучитьЧисло(начало);  
   Если конец<начало Тогда  
       конец = 240000 + конец;
   КонецЕсли;
   ТекВремя = ПолучитьЧисло(ТекущееВремя());
   Если (ТекВремя > начало) И (ТекВремя < конец) Тогда
       Сообщить("ТекВремя " + ТекВремя);
   КонецЕсли    
КонецПроцедуры
36 smaharbA
 
07.12.10
13:49
(27) либо строка, либо количество секунд в сутках
текущее так же
37 Протез
 
07.12.10
13:50
(35) нафига там сравнение? К "Конец" сразу добавь 86400 да и всё.
38 Протез
 
07.12.10
13:51
+37 не сравнение, а условие "Если конец<начало Тогда", описался.
39 palpetrovich
 
07.12.10
13:52
(37) нифига
конец="12:05:01";
начало="11:15:00";          
а сейчас к примеру  - "12:54:01"
40 ptiz
 
07.12.10
13:54
Чем (5) не подходит в части
Число(СтрЗаменить(текЗнач, ":", ""))
?

И хоть обсравнивайся.
41 zva
 
07.12.10
13:54
точнее в (34) одна скобка лишняя
Если ( (конец > начала) и (конец > текущее) и (начало < текущее) ) ИЛИ ( (конец < начала) и ((текущее < конец) или (текущее > начала)) )  Тогда
42 palpetrovich
 
07.12.10
13:58
(36) если "количество секунд в сутках" - 35 упрощается, но условие все-равно нужно
Если конец<начало Тогда  
      конец = конец + 86400;
 КонецЕсли;
43 smaharbA
 
07.12.10
14:03
вот жеж тупой я

if [ $start -lt $ctime -a $ctime -lt 86400 ] || [ 0 -lt $ctime -a $ctime -lt $end ]; then
   echo Попали
fi


но как бы еще упростить
44 smaharbA
 
07.12.10
14:04
ан не фига
45 smaharbA
 
07.12.10
14:12
все почти верно, но лишние присвоения перед условием будут :(
46 Fragster
 
гуру
07.12.10
14:18
(14) как раз наоборот
47 smaharbA
 
07.12.10
14:21
(46) и ты еще называешь виндузятников тупыми ))

как бы упростить ?
(можно и на адинес)

min=$start
max=$end
if [ $min -gt $max ];then
   max=86400; min=0;
fi
echo min=$min max=$max
if [ $start -lt $ctime -a $ctime -lt $max ] || [ $min -lt $ctime -a $ctime -lt $end ]; then
   echo Попали
else
   echo Не попали
fi
48 palpetrovich
 
07.12.10
14:28
продолжаю не понимать :( чем не нижеизложенное не нравиться ?(если "количество секунд в сутках")

  Если конец<начало Тогда  
      конец = конец + 86400;
  КонецЕсли;
  ТекВремя = ТекущееВремя();
  Если (ТекВремя > начало) И (ТекВремя < конец) Тогда
      Сообщить("Попали");
  КонецЕсли
49 smaharbA
 
07.12.10
14:29
на адинес это примерно

Максимум=Конец;
Минимум=Начало;
Если Начало > Конец Тогда
   Максимум="24:00:00";
   Минимум="00:00:00";
КонецЕсли;

Если ((Начало < ТекущееВремя()) и (ТекущееВремя() < Максимум))
   или ((Минимум < ТекущееВремя()) и (ТекущееВремя() < Конец)) Тогда
   Сообщить("Попали");
КонецЕсли;
50 palpetrovich
 
07.12.10
14:30
+48 ТекВремя = ТекущееВремя(); - лишнее
51 palpetrovich
 
07.12.10
14:31
(49)  Минимум="00:00:00"; - имхо, так нельзя
52 palpetrovich
 
07.12.10
14:32
+(51) можно другое имхо :))
53 zva
 
07.12.10
14:37
(49) чем (41) не нравится?
54 smaharbA
 
07.12.10
14:43
(53) можно и так
но вот как бы упростить, может посчитать какието "магические" числа
55 ice777
 
07.12.10
14:50
(0)а чем дата не угодила? один раз перевел в даты начало и конец периода и не надо текуще время постоянно в некие величины перегонять.
56 ice777
 
07.12.10
14:51
+(55) или в секунды, как уже предлагалось.
57 smaharbA
 
07.12.10
14:52
не (41) не канает
(55) нету даты, есть только время
58 smaharbA
 
07.12.10
14:52
(56) и что делать с секундами ? читал внимательно сабж ?
59 smaharbA
 
07.12.10
14:53
(48) и что будет когда текущее время 0:0:1 ?
60 smaharbA
 
07.12.10
14:54
(37(38) луччеб ты опИсался
61 ice777
 
07.12.10
14:54
(58) переведи нач.датувремя в сек. и считай сек до конечной или сравнивай с конечным в сек. )
62 ice777
 
07.12.10
14:56
(59) дополни условие ) с учетом перехода точки 0:0:0
63 Протез
 
07.12.10
14:59
(60) Я смотрю тебе этот алгоритм нужен, как ишаку педали. Тебе нормальное решение предложили, переводи в секунды и сравнивай числа. К конечной дате если она в следующих сутках надо добавить 86400.
64 Попытка1С
 
07.12.10
15:02
(63) +1
такое ощущение что абрахамс постебатся решил...
65 smaharbA
 
07.12.10
15:04
(63) не болтайте ерундой
(64) пока кроме довольно сложного (49) не было рабочего решения в ветке (хоть когда то просто так задавал вопросы ?)
66 mishgan75
 
07.12.10
15:04
ТекВремя =(Час(ДатаХ)*60+Мин(ДатаХ))*60+Секунда(ДатаХ);
Если текВремя<27901 или ТекВремя>69300 тогда

//где 27901 - 7:45:01 в секундах, 69300 - 19:15:00 в секундах
67 ice777
 
07.12.10
15:04
(63) да и сек эти нафиг надо, тип датавремя их уже содержит.
(64) админская болезнь-с.)
68 ice777
 
07.12.10
15:05
(66) каждый раз текущее пересчитывается.. раньше бы за такую идею голову б отбили, машины были не мощными.)
69 mishgan75
 
07.12.10
15:05
(66) маленькое исправление по поводу минут:)
ТекВремя =(Час(ДатаХ)*60+Минута(ДатаХ))*60+Секунда(ДатаХ);
70 Протез
 
07.12.10
15:06
(67) У него нет даты времени, только время х.з. в каком виде.
71 smaharbA
 
07.12.10
15:06
(66) и ?
72 mishgan75
 
07.12.10
15:07
(69) Зато точное и простое
73 mishgan75
 
07.12.10
15:08
(77) описался вместо Минута() использовал Мин() две большие разницы
74 smaharbA
 
07.12.10
15:08
(72) что точное ? и что будет если конец больше начала ?
75 smaharbA
 
07.12.10
15:09
пейсателей пруд пруди
76 ice777
 
07.12.10
15:11
(70) в секундах и содержит, упрощенно, попробуй отнять )
(74) что такое конец в твоей интерпретации, я уже догадываюсь )
77 ado
 
07.12.10
15:23
(58)

Если (((ВремяСек > НачСек) и (ВремяСек < КонСек)) и (НачСек < КонСек)) или (((ВремяСек < НачСек) и (ВремяСек > КонСек)) и (НачСек > КонСек)) Тогда
   Сообщить("Попали в интервал");
КонецЕсли;

Тебе это надо было, или что-то другое? Если другое, то прожуй кашу во рту, и объясни внятно.
78 smaharbA
 
07.12.10
15:34
(77) уже было, попробуй сам

Если ((58801 > 57660) и (58801 < 23400) и  (57660 < 23400))
или ((58801 < 57660) и (58801 > 23400) и  (57660 > 23400))
79 smaharbA
 
07.12.10
15:36
(77) т.е. ты считаешь это верным и простым решением ?

кто еще ?
80 ado
 
07.12.10
15:38
+(77) Тьфу, пелять, гоню. Правильно так:

Если (((ВремяСек > НачСек) и (ВремяСек < КонСек)) и (НачСек < КонСек)) или ( ((ВремяСек > НачСек) и (ВремяСек > КонСек)) или ((ВремяСек < НачСек) и (ВремяСек < КонСек)) ) и (НачСек > КонСек)) Тогда
   Сообщить("Попали в интервал");
КонецЕсли;
81 orefkov
 
07.12.10
15:40
(begin <= end && (t >= begin && t <=end))
||
(begin > end && (t <= end || t >= begin))
82 ado
 
07.12.10
15:41
(79) Это простое, но неверное решение. Простое и верное в (80) ;-)
83 ado
 
07.12.10
15:42
(81) Втрое условие слегка посложнее должно быть.
84 orefkov
 
07.12.10
15:43
(83)
Обоснуй
85 trad
 
07.12.10
15:45
(65).2
при каких Начало, Конец, Текущее решение в (28) не верно
86 ado
 
07.12.10
15:46
(83) Не обосную. Прочитал не внимательно. Всё правильно там.
87 ado
 
07.12.10
15:47
А вот как же я загнался, что по лишнему условию в (80) влепил ... не, надо в отпуск идти.
88 trad
 
07.12.10
15:48
(81)
Саня, баян. См.28
89 orefkov
 
07.12.10
15:48
Че тут думать, нарисуйте и все ясно
'-' - не попадает в интервал
'+' - попадает в интервал
Случай 1
-------Начало+++++++++Конец-------
Случай 2
+++++++Конец----------Начало++++++
90 Туц
 
07.12.10
15:52
(0)Если начало больше чем конец, то разбить на два промежутка.
Допустим с 21 по 7. Разбиваем на с 21-24 и 0-7.
Если входит в один из диапазонов, то ещё не пришло время.
91 ado
 
07.12.10
15:54
(90) Не надо ничего разбивать. См (28)(80)(89)
92 orefkov
 
07.12.10
15:54
(85), (88)
В (28) не сработает при таких входных данных:
Начало="19:00:00"
Конец="21:00:00"
Текущее="19:00:00"

У тебя там везде сравнения строгие.
93 Туц
 
07.12.10
15:56
Если Начало>Конец Тогда
       Если ((Начало<ТекВремя) и (ТекВремя<24)) или ((0<ТекВремя) и (ТекВремя<Конец)) Тогда
           Возврат "Пока работаем";
       Иначе
           Возврат "Пора закругляться";
       КонецЕсли;
   ИначеЕсли (Начало<ТекВремя) и (ТекВремя<Конец) Тогда
       Возврат "Пока работаем";
   Иначе
       Возврат "Пора закругляться";
   КонецЕсли;
94 ado
 
07.12.10
15:58
(92) Автор не указывал, считать ли границы диапазона входящими в него.
95 trad
 
07.12.10
15:58
(92) ну это как считать: находясь на границе попадаем/не попадаем в интервал?..
96 trad
 
07.12.10
15:59
(92) ну это _смотря_ как считать
97 smaharbA
 
07.12.10
16:01
(81)
да пожалуй, вот бы еще упростить
98 smaharbA
 
07.12.10
16:02
(91) в (28) и (29) не работающие варианты
99 smaharbA
 
07.12.10
16:03
в (28) и (80) не работающе варианты
100 smaharbA
 
07.12.10
16:04
(94) это не важно
101 АЛьФ
 
07.12.10
16:05
Раз тема идет, предложу свой вариант (навскидку).
НачВремя = 63900; // 19:15:00
КонВремя = 27901; // 07:45:01
ч24Время = 86400; // 24:00:00
ТекВремя = 75600; // 21:00:00

пНачВремя = ч24Время - НачВремя;
пКонВремя = ч24Время - (КонВремя - НачВремя);
пТекВремя = ч24Время - (ТекВремя - НачВремя);

Если (пТекВремя >= пНачВремя) и (пТекВремя <= пКонВремя) Тогда
 Сообщить("попали!");
КонецЕсли;

Как-то так...
102 smaharbA
 
07.12.10
16:14
воот с расчетами интересно то-же
103 smaharbA
 
07.12.10
16:16
пока выбираю

Первый
min=$start
max=$end
if [ $min -gt $max ];then
   max=86400; min=0;
fi
lt $ctime -a $ctime -lt $end ]"
if [ $start -lt $ctime -a $ctime -lt $max ] || [ $min -lt $ctime -a $ctime -lt $end ]; then
   echo Попали 1
else
   echo Не попали 1
fi

Второй

if [ $start -lt $end -a $start -lt $ctime -a $ctime -lt $end ] || [ $start -gt $end ] && [ $start -lt $ctime -o $ctime -lt $end ]; then
   echo Попали 2
else
   echo Не попали 2
fi


АЛьФ-овский еще не осознал
104 smaharbA
 
07.12.10
16:17
lt $ctime -a $ctime -lt $end ]"
лишнее
105 АЛьФ
 
07.12.10
16:17
2(103) Он еще сам не осознал...
106 zva
 
07.12.10
16:37
(103) а чем второй вариант отличается от (41)?
точнее не понял (57)
107 palpetrovich
 
07.12.10
16:43
(103) а че за язык? ... for..rof, case..esac :)
108 orefkov
 
07.12.10
16:46
(103)
Второй способ отличается от (28) и (81) только формой записи.
Насчет упростить:
Если обозначим условия
Нач<Кон - а
Тек>Нач - b
Тек<Кон - c
то переходим на http://www.wolframalpha.com/input/?i=(a+%26+(b+%26+c))+%7C%7C+(%21a+%26+(b+%7C%7C+c)), тыкаем "Minimal forms" - "Text notation" и выбираем, что больше нравиться. Мне больше понравилась DNF:
((NOT a) AND b) OR ((NOT a) AND c) OR (b AND c)
Тока боюсь, вряд ли это можно назвать упрощением - запись получется не короче, а вот наглядность теряется.
109 smaharbA
 
07.12.10
16:50
(108) в (28) не так совсем содержание, не форма

(108) нет упростить не в форе, а в содержании
110 smaharbA
 
07.12.10
16:51
(106) каюсь, в (41) оно самое и было так же
111 Shaman100M
 
07.12.10
17:06
Если (Текущее-Начало)*(Текущее-Конец)>0 Тогда...

Текущее от 0 до 7:45     (<0)*(<0) > 0 - подходит
Текущее от 7:45 до 19:15 (<0)*(>0) < 0 - не подходит
Текущее от 19:45 до 23:59 (>0)*(>0) > 0 - подходит

ну, граничные значения еще проверить
112 Shaman100M
 
07.12.10
17:32
доработка...

(Текущее-Начало)*(Текущее-Конец)*(Начало-Конец)>0
113 palpetrovich
 
07.12.10
17:49
(112) красиво :)
114 palpetrovich
 
07.12.10
17:52
+(113) еще можно все все сдвинуть по шкале так что Начало=0
так примерно
       конец = ?(конец<начало, конец + 86400 - начало, конец - начало);
       текущее = ?(текущее<начало, текущее + 86400 - начало, текущее - начало);  
       Если текущее < конец Тогда
           Сообщить("Попали!");
       КонецЕсли
115 smaharbA
 
07.12.10
18:16
(112)
(5Часов-22Часа) - не попали
116 smaharbA
 
07.12.10
18:25
хотя может быть
117 Жан Пердежон
 
07.12.10
18:41
чот не вкурил, чего ТСу надо

ЕСЛИ ((Нач<=Кон) и (ТекВР>=Нач) и (ТекВР<=Кон))
ИЛИ ((Нач>Кон) и (ТекВР<Нач) и (ТекВР>Кон)) тогда
118 smaharbA
 
07.12.10
18:42
еще один
119 Жан Пердежон
 
07.12.10
18:44
(118) ну как в (0) написал
120 Жан Пердежон
 
07.12.10
18:52
+(117) знаки только
ЕСЛИ ((Нач<=Кон) и (ТекВР>=Нач) и (ТекВР<=Кон))
ИЛИ ((Нач>Кон) и (ТекВР>=Нач) или (ТекВР<=Кон)) тогда
121 ado
 
07.12.10
19:03
(99) Обоснуй
122 smaharbA
 
08.12.10
07:32
(121) сам ты обоснуй )))
про (77), в (80) не зырил, больно мутный он
123 smaharbA
 
08.12.10
07:33
оставил вариант orefkov но думается должно быть упрощение
(унарные операции так же не запрещены)
124 orefkov
 
08.12.10
08:56
(123)
В С/C++ можно так упростить:
begin < end ? t >= begin && t <=end : t >= begin || t <=end

В bash'е прокатит еще так:

test $t -gt $start `test $start -lt $end && echo "-a" || echo "-o"` $t -lt $end && echo Попали || echo Не попали
125 Simod
 
08.12.10
09:51
(0) Нужно решение только для случаев ВремяНачала > ВремяКонца ?
126 Туц
 
08.12.10
10:15
Можно так

   Если Кон < Нач Тогда Рез = 1 Иначе Рез = 0 КонецЕсли;
   Если (Мин(Нач,Кон)<Тек) и (Тек<Макс(Нач,Кон)) Тогда Рез = Рез + 1 КонецЕсли;
   Возврат Рез%2;
127 smaharbA
 
08.12.10
11:04
(124)

`test $start -lt $end && echo "-a" || echo "-o"`

это субшел, это медленно
128 ado
 
08.12.10
12:31
(122) В (80) пара лишних условий, не влияющих на результат, а так, тоже самое, что (28) и (81). Эти варианты, ИМХО, упростить уже некуда.
129 Киборг
 
08.12.10
12:39
Всегда можно выбрать интервал [меньше; больше], но в одном случае (если начало лежит в "меньшем времени") это будет означать, что "попали", а в другом, что "не попали"
130 Domovoi
 
08.12.10
16:36
81 пост понадобился, чтоб правильно написать. "Просто 1совцы"))
131 ЗлобнийМальчик
 
08.12.10
16:44
(0) в таких случаях я почти всегда предлагаю написать функцию типа ДатаВходитВНерабочееВремя(дата), которая возвращает булево значение. Или этот вариант недостаточно прост?
2 + 2 = 3.9999999999999999999999999999999...