Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / работа с временем / 14 сообщений из 14, страница 1 из 1
16.05.2019, 21:18
    #39814283
garun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с временем
Добрый вечер! Есть такой список временных промежутков:

13:24:49 - 14:27:42
16:07:14 - 16:07:26
18:25:13 - 18:38:14
20:16:50 - 20:57:58
21:04:05 - 22:43:40
23:59:26 - 23:59:59

нужно исходя из этого списка определить сколько секунд входит в каждый час суток (от 0 до 23).
например, в 10-й час входит 0 секунд, в 18-й 781 секунда, а в 23-й 33 секунды. помогите пожалуйста с кодом.
...
Рейтинг: 0 / 0
16.05.2019, 21:25
    #39814287
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с временем
Цикл от 0 до 23 часов и перебирай все отрезки на предмет вхождения в час.
...
Рейтинг: 0 / 0
16.05.2019, 21:26
    #39814288
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с временем
garun,

System.DateUtils.HourOf,
System.DateUtils.SecondsBetween
...
Рейтинг: 0 / 0
16.05.2019, 22:19
    #39814308
garun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с временем
rgreat Цикл от 0 до 23 часов и перебирай все отрезки на предмет вхождения в час.

ну допустим перебором определил что 13-й час входит в отрезок 13:24:49 - 14:27:42, а как разобрать этот отрезок чтобы выяснить что в этот 13-й час входит 2111 секунд?

Kazantsev AlexeySystem.DateUtils.HourOf,
System.DateUtils.SecondsBetween

да это всё понятно. не понятно как это всё применить.
кому не сложно, помогите с кодом пожалуйста
...
Рейтинг: 0 / 0
16.05.2019, 22:26
    #39814312
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с временем
Пересечь 2 отрезка слабо?
...
Рейтинг: 0 / 0
16.05.2019, 22:33
    #39814315
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с временем
garun,

алгоритм 'в лоб':

1. разбираем время на отрезки по часам: 13:24:49 - 14:27:42 (13:24:49 - 14:00:00; 14:00:00-14:27:42), 21:04:05 - 22:43:40 на два отрезка, остальные - один.
2. смотрим к какому часу принадлежит каждый отрезок: 13:24:49 - 14:00:00 - 13-й, добавляем к 13-му часу дельту секунд.

возможно существует более элегантный вариант
...
Рейтинг: 0 / 0
16.05.2019, 22:42
    #39814320
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с временем
13:00:00 - 14:27:42 = -1:27:42
14:00:00 - 13:24:49 = 0:35:11

min(max(35:11,0),3600) - min(max(-1:27:42,0),3600) = 35:11
...
Рейтинг: 0 / 0
16.05.2019, 23:43
    #39814332
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с временем
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
var SDate, FDate, SHour: TDatetime;
    M: array[1..24] of integer;
    H, S: integer;
begin
  while not DS.Eof do begin
    SDate := DS['SDate'];  // 13:24:49
    FDate := DS['FDate'];  // 14:27:42
    while SDate < FDate do begin
      H := HourOf(SDate); // номер часа 13
      SHour := EncodeDateTime(YearOf(SDate),MonthOf(SDate),DayOf(SDate),HourOf(SDate),0,0,0); // начало часа 13:00:00
      IncHour(SHour,1);                         // начало следующего часа 14:00:00
      if FDate < SHour then begin               // если конечная дата меньше начала следующего часа 14:27:42 > 14:00:00
        Inc(M[H], SecondsBetween(FDate,SDate)); // заносим разницу в нужный час
        Continue;
      end
      else begin
        Inc(M[H], SecondsBetween(SHour,SDate));  // заносим разницу до начала следующего часа
        SDate := SHour;
      end;
    end;
  end;
end;
...
Рейтинг: 0 / 0
17.05.2019, 09:31
    #39814413
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с временем
garun,

т.е. переход на следующий день не предполагается?
Код: plaintext
23:59:26 - 00:45:59
...
Рейтинг: 0 / 0
17.05.2019, 09:41
    #39814418
garun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с временем
kealon(Ruslan)garun,

т.е. переход на следующий день не предполагается?
Код: plaintext
23:59:26 - 00:45:59

Нет.

DimaBr
Код: pascal
1.
    while SDate < FDate do begin


У вас цикл бесконечный :(
...
Рейтинг: 0 / 0
17.05.2019, 10:57
    #39814481
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с временем
garunУ вас цикл бесконечный :(
Там ДВА бесконечных цикла. Писалось на коленке
1. Вместо Continue нужен Break
2. В конце DS.Next
...
Рейтинг: 0 / 0
17.05.2019, 12:08
    #39814529
garun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с временем
DimaBrgarunУ вас цикл бесконечный :(
Там ДВА бесконечных цикла. Писалось на коленке
1. Вместо Continue нужен Break
2. В конце DS.Next

Заменил Continue на Break и DS на цикл for . Но всё равно " while SDate < FDate" выполняется бесконечно. Что тут не так?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
 
var
   SDate, FDate, SHour: TDatetime;
    M: array[0..23] of integer;
    H, S: integer;
   AList: TStringList;
begin

 AList:= TStringList.Create;
 AList.Add('13:24:49-14:27:42');
 AList.Add('16:07:14-16:07:26');
 AList.Add('18:25:13-18:38:14');
 AList.Add('20:16:50-20:57:58');
 AList.Add('21:04:05-22:43:40');
 AList.Add('23:59:26-23:59:59');

 for i:= 0 to AList.Count - 1 do
 begin
    SDate := Date + StrToTime(Copy(AList[i], 1, 8));  // 13:24:49
    FDate := Date + StrToTime(Copy(AList[i], 10, 8));  // 14:27:42
    while SDate < FDate do
    begin
      H := HourOf(SDate); // номер часа 13
      SHour := EncodeDateTime(YearOf(SDate),MonthOf(SDate),DayOf(SDate),HourOf(SDate),0,0,0); // начало часа 13:00:00
      IncHour(SHour,1);                         // начало следующего часа 14:00:00
      if FDate < SHour
      then
      begin               // если конечная дата меньше начала следующего часа 14:27:42 > 14:00:00
        Inc(M[H], SecondsBetween(FDate,SDate)); // заносим разницу в нужный час
        Inc(AL);
        Break;
      end
      else
      begin
        Inc(M[H], SecondsBetween(SHour,SDate));  // заносим разницу до начала следующего часа
        SDate := SHour;
      end;
    end;
 end;

 for i:= Low(M) to High(M) do
 mmo2.Lines.Add(i.ToString + ': '+IntToStr(M[i]));
...
Рейтинг: 0 / 0
17.05.2019, 13:07
    #39814563
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с временем
Неужеле трудно с отладчиком пройти, ведь подсказки с числами в каждой строке
...
Рейтинг: 0 / 0
17.05.2019, 14:42
    #39814636
garun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с временем
DimaBr,

да, действительно, я ставил IncHour, но как оказалось не там где нужно). благодарю!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / работа с временем / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]