Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.037 c
14-1097962722
Кто---то
2004-10-17 01:38
2004.11.14
Есть ли стандартный Диалог с КомбоБоксом ?


1-1099386098
Некто
2004-11-02 12:01
2004.11.14
За пределы формы


14-1098720801
Mirror
2004-10-25 20:13
2004.11.14
Почему у нас такие люди?


4-1096978644
Delphi5.01
2004-10-05 16:17
2004.11.14
как программно поймать процесс изменения Modify


6-1094458503
Cuest
2004-09-06 12:15
2004.11.14
TTelefoon





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский