powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / работа с временем
14 сообщений из 14, страница 1 из 1
работа с временем
    #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
работа с временем
    #39814287
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Цикл от 0 до 23 часов и перебирай все отрезки на предмет вхождения в час.
...
Рейтинг: 0 / 0
работа с временем
    #39814288
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
garun,

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

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

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

да это всё понятно. не понятно как это всё применить.
кому не сложно, помогите с кодом пожалуйста
...
Рейтинг: 0 / 0
работа с временем
    #39814312
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пересечь 2 отрезка слабо?
...
Рейтинг: 0 / 0
работа с временем
    #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
работа с временем
    #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
работа с временем
    #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
работа с временем
    #39814413
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
garun,

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

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

Нет.

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


У вас цикл бесконечный :(
...
Рейтинг: 0 / 0
работа с временем
    #39814481
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
garunУ вас цикл бесконечный :(
Там ДВА бесконечных цикла. Писалось на коленке
1. Вместо Continue нужен Break
2. В конце DS.Next
...
Рейтинг: 0 / 0
работа с временем
    #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
работа с временем
    #39814563
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужеле трудно с отладчиком пройти, ведь подсказки с числами в каждой строке
...
Рейтинг: 0 / 0
работа с временем
    #39814636
Фотография garun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr,

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


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