Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как подсчитать время прошедшее между двумя датами?


Страницы:   1 2

SSSdd ©   (2004-10-30 10:06:00) 

Имеется одна дата 12.06.2004 и вторая дата 24.08.2004.
Как программно подсчитать сколько прошло времени, в месяцах, днях и годах между начальной и конечной датами?


Anatoly Podgoretsky   (2004-10-31 00:46:00) [1]

SSSdd   (30.10.04 19:21) [27]
Тогда при таком определении, алгоритм следующий

Interval := ABS(Trunc(D1) - Trunc(D2));


SSSdd   (2004-10-30 19:21:00) [2]

>Anatoly Podgoretsky ©   (30.10.04 15:25) [20]
>1.01.2004 и 2.01.2004 это сколько дней

Это 1 день, поскольку во сколько документы забрали - нет ни какой
разницы, а значит считаю что их забрали рано-рано утром.

>1.01.2004 23:59:59 и 2.01.2004 00:00:01 это сколько дней

Я считаю по числам а не по часам а значит, что с 1.01.2004 23:59:59  до 2.01.2004 00:00:01 прошел 1 день!


SergP   (2004-10-30 19:13:00) [3]


> [22] Anatoly Podgoretsky ©   (30.10.04 16:06)
> type
>  TDate = TDateTime


Согласен, я неправильно выразился...
Просто хотел сказать что время в часах, минутах и т.д. автор сабжа судя по сабжу не собирался учитывать, а что касается некоторой неоднозначности в определении "времени в годах, месяцах и днях" то она требует двух уточнений:
1). Какое кол-во дней в месяце.
2). Включаются или нет конечные даты.

Вобще-то я в [15] уже попытался ответить автору сабжа в том виде, в котором все недостающие данные найти и поставить будет уже его задачей.


> Почему такие элементарные вопросы вызывают такое бурное
> обсуждение?


Вот именно из-за того что элементарные, потому и вызывают столь бурное обсуждение. :-)))


begin...end   (2004-10-30 18:35:00) [4]


> [23] Piter ©   (30.10.04 16:47)

> Почему такие элементарные вопросы вызывают такое бурное
> обсуждение?

Потому что они только кажутся элементарными... :-)


GuAV   (2004-10-30 17:18:00) [5]

Piter ©   (30.10.04 16:47) [23]
Почему такие элементарные вопросы вызывают такое бурное обсуждение?


Именно "элементарные" вопросы обычно вызывают бурное обсуждение. Тут действительно есть не однозначность. Например, определи что есть "за последние 2 дня". Впрочем тут и так примеров хватает.


Piter   (2004-10-30 16:47:00) [6]

Почему такие элементарные вопросы вызывают такое бурное обсуждение?
Не пойму я этого...


Anatoly Podgoretsky   (2004-10-30 16:06:00) [7]

type
 TDate = TDateTime


К тожу же вопрос не про тип, а сколько дней в первом и втором случае. На этот вопрос может дать ответ только автор, и от него будет зависть алгоритм расчета.


SergP   (2004-10-30 16:03:00) [8]


> и второй уточняющий вопрос, то же самое но в дате есть и
> время
> 1.01.2004 23:59:59 и 2.01.2004 00:00:01 это сколько дней


В сабже ничего не сказано о том что используется TDateTime а не TDate.
Следовательно если речь идет о датах, то время тут не при чем...


Anatoly Podgoretsky   (2004-10-30 15:25:00) [9]

SSSdd   (30.10.04 12:32) [14]
Можно и в днях, но ты не отвечаешь на первый уточняющий вопрос

1.01.2004и 2.01.2004это сколько дней

и второй уточняющий вопрос, то же самое но в дате есть и время
1.01.2004 23:59:59и 2.01.2004 00:00:01это сколько дней


-SeM-   (2004-10-30 14:47:00) [10]

Опа, у меня [16] ошибка ...


-SeM-   (2004-10-30 14:38:00) [11]

SSSdd   (30.10.04 14:04) [17]

> Что такое  DaysBetween?

F1?


SSSdd   (2004-10-30 14:04:00) [12]

Что такое   DaysBetween?


-SeM-   (2004-10-30 14:00:00) [13]

А вот что у меня вышло :)


var year, month, day: Word;
   text: String;
   date1, date2 : TDate;
   days: Word;

 date1 := StrToDate('20.05.2003'); // (Edit1.Text);
 date2 := StrToDate('10.08.2003'); // (Edit2.Text);

 text :='Прошло времени: ';
 days := DaysBetween(date2, date1);
 if days > 0 then begin
   if IsInLeapYear(date1) or IsInLeapYear(date2) then inc(days);
   DecodeDate(days , year, month, day);
   day := day - 1;
   if day = 30 then begin
      inc(month);
      day := 0;
   end;
   month := month - 1;
   if month = 12 then begin
      inc(year);
      month := 0;
   end;
   year := year - 1900;
   text := text + ' лет - ' + IntToStr(year) +
                  ' месяцев - ' + IntToStr(month) +
                  ' дней - ' + IntToStr(day);
 end
 else text := text + ' меньше суток';
//  Label1.Caption := text;


Поругайте, я у себя исправлю ;)


SergP.   (2004-10-30 13:55:00) [14]

Вобщем для общего случая:

popravka1:
0 - Если одна из дат не включается
1 - Обе даты включаются
-1 - Обе даты не включаются

popravka2:
Количество дней в месяце используемое для вычислений....

DecodeDate(datebegin,y1,m1,d1);
DecodeDate(dateend + popravka1,y2,m2,d2);

dx := d2 - d1;
if dx < 0 then
begin
inc(dx,popravka2);
dec(m2);
end;

mx := m2 - m1;
if mx < 0 then
begin
inc(mx,12);
dec(y2);
end;

yx := y2 - y1;

Получаем:
yx - кол-во лет
mx - кол-во месяцев
dx - кол-во дней


SSSdd   (2004-10-30 12:32:00) [15]

А если просто в месяцах или днях?

ПОМОГИТЕ ПОЖАЛУЙСТА.


sniknik   (2004-10-30 12:12:00) [16]

неправильно, на самом деле прошло 2 месяца и 21 день
в 5 31 день значит до 6го 11 + 30(6й) + 31(7й) + 10 итого 82, что и показывает разность этих двух дат,
а вот ккой результат показвать при  
Отданы         : 11.05.2003
Сегодня        : 10.08.2003
?
2 месяца и 30дней или 3 месяца? (или может, но не с этими месяцами, 3месяца и 2 дня ???)

требуй от заказчика точную формулу расчета. имхо. потому как если он твою не поймет это гарантировано припишут к глюку программы, даже если по твоему вернее будет.


Anatoly Podgoretsky   (2004-10-30 11:59:00) [17]

Пусть твой заказчик дасть точное определение сколько дней в месяце, только тогда задача будет иметь решение.


SSSdd   (2004-10-30 11:40:00) [18]

Мне нужно вот что, я делаю программу которая работает с документами . Я ее почти закончил, но заказщик сказал что ему нужно следующее :
нужно чтобы программа показывала когда документы отданы и сколько с тех пор прошло времени.
Когда они отданы - эта дата последнего изменения файла архива. Потом есть еще и сегодняшняя дата и надо между этими датами подсчитать сколько прошло времени.
Например :

Отданы         : 20.05.2003
Сегодня        : 10.08.2003
Прошло времени : 2 месяца 20 дней.


ну или что-то вроде того. Можете помочь?


Anatoly Podgoretsky   (2004-10-30 11:40:00) [19]

-SeM-   (30.10.04 11:31) [9]
d2 - d1 + 1
второй вопрос зависит от ответа на первый, может и не понадобится.

Ничто так тяжело не дается людям с высшим образованием, как работа со временем.


-SeM-   (2004-10-30 11:31:00) [20]

Anatoly Podgoretsky ©
Объясните пожалуйста, в каком случае (в вашем примере) разница будет составлять 2 дня.

> есть и еще один

Какой?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо