Имя: Пароль:
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) в таких случаях я почти всегда предлагаю написать функцию типа ДатаВходитВНерабочееВремя(дата), которая возвращает булево значение. Или этот вариант недостаточно прост?
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан