Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.14;
Скачать: CL | DM;

Вниз

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

 
SSSdd   (2004-10-30 10:06) [0]

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


 
SergP ©   (2004-10-30 10:16) [1]

В днях можно (от большей даты отнять меньшую).
А вот в днях, месяцах, годах - это самому придется писать такую функцию, ибо результат неоднозначен так как месяц может включать в себя разное число дней (от 28 до 31)


 
SergP ©   (2004-10-30 10:27) [2]

Например:

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

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

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

yx := y2 - y1;

Вобщем что-то в этом роде.... ИМХО ...


 
-SeM-   (2004-10-30 10:47) [3]

DateUtils *Between


 
Anatoly Podgoretsky ©   (2004-10-30 11:14) [4]

12.06.2004 и 13.06.2004, сколько дней 1, 2 или 3?


 
begin...end ©   (2004-10-30 11:19) [5]


> [4] Anatoly Podgoretsky ©   (30.10.04 11:14)

Не больше двух.


 
Anatoly Podgoretsky ©   (2004-10-30 11:21) [6]

0 1 2 и
то первй уточняющий вопрос, есть и еще один, и без ответа на них нельзя сказать какую формула расчета использовать


 
begin...end ©   (2004-10-30 11:24) [7]


> [6] Anatoly Podgoretsky ©   (30.10.04 11:21)

Честно говоря, не понял, что Вы хотели сказать :-)
Может ли между 12.06.2004 и 13.06.2004 быть больше, чем 2 дня? Или Вы про округление/отбрасывание?


 
Anatoly Podgoretsky ©   (2004-10-30 11:26) [8]

begin...end ©   (30.10.04 11:24) [7]
Ну так прочитай поправку в [6]


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

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

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

Какой?


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

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

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


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

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

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


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


 
Anatoly Podgoretsky ©   (2004-10-30 11:59) [12]

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


 
sniknik ©   (2004-10-30 12:12) [13]

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

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


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

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

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


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

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

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 - кол-во дней


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

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


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;


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


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

Что такое  DaysBetween?


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

SSSdd   (30.10.04 14:04) [17]

> Что такое  DaysBetween?

F1?


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

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


 
Anatoly Podgoretsky ©   (2004-10-30 15:25) [20]

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 это сколько дней


 
SergP ©   (2004-10-30 16:03) [21]


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


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


 
Anatoly Podgoretsky ©   (2004-10-30 16:06) [22]

type
 TDate = TDateTime


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


 
Piter ©   (2004-10-30 16:47) [23]

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


 
GuAV ©   (2004-10-30 17:18) [24]

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


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


 
begin...end ©   (2004-10-30 18:35) [25]


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

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

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


 
SergP ©   (2004-10-30 19:13) [26]


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


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

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


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


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


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

>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 день!


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.11.14;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.047 c
14-1098978925
Alex*
2004-10-28 19:55
2004.11.14
А чем теперь архивы форумов распоковывают


3-1098041327
Sid
2004-10-17 23:28
2004.11.14
Ошибка в Ibase- readonly table


14-1098879385
infom
2004-10-27 16:16
2004.11.14
Программа для организации небольшого оборота задач и событий


3-1097736858
alsov1
2004-10-14 10:54
2004.11.14
Как в timestamp записать милисекунды?


3-1097946906
techgl
2004-10-16 21:15
2004.11.14
Поиск в БД