Форум: "Основная";
Текущий архив: 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