![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разница между датами [D7, XP]
Andy BitOff (ppc) © (2007-11-08 13:07:00)
Страницы: < 1 2 3 4 5 6 7 8 9 >
Здравствуйте.
Что-то у меня уже башка не варит, сижу парюсь и шарики за ролики заходят...
Никак не удается получить разничу между датами в формате dd.mm.yy.
Например.
05.11.2007 и 08.11.2007 должно получиться 03.00.00, но при работе с типом дата месяц (как и год) не может быть равен 0.
Может кто подскажет как это можно реализовать?
SergeyIT (2007-11-09 00:06:00) [121]
> Johnmen © (08.11.07 23:35) [43]
> ... все твои ф-ии,
Хами демагог. Предлагаю Вам написать программу для расчета вашего возраста в годах, месяцах, днях - если не можете - то вам здесь не место, ведь помогать новичкам - это обмен информацией, а не словесным поносом. (я свой возраст подсчитал = 20.6.53)
А автору темы просто надо проверить и подстроить под то, что ему надо (и под тот Дельфи, который он использует).
Johnmen (2007-11-08 23:35:00) [122]
> SergeyIT (08.11.07 22:18) [42]
> С моей функцией
> 16.06.2007 - 15.07.2007 = 29.0.0
> 16.07.2007 - 15.08.2007 = 30.0.0
15.06.2007 - 15.07.2007 = ?
15.06.2007 - 16.07.2007 = ?
15.06.2007 - 17.07.2007 = ?
> Как я и говорил - надо проверять.
Кому надо? Мне - не надо, т.к. я знаю, что все твои ф-ии, и написанные и будущие на данную тему, НИКОГДА не дадут ВЕРНЫЙ результат. Ну когда перестанут выдавать "ошибки в Дельфи5"...
И что по поводу "Что выше - кислый или темный?"?
SergeyIT (2007-11-08 22:18:00) [123]
> Что получится
С моей функцией
16.06.2007 - 15.07.2007 = 29.0.0
16.07.2007 - 15.08.2007 = 30.0.0
01.01.2004 - 01.03.2004 = 0.2.0
01.01.2004 - 29.02.2004 = ошибка в Дельфи5 (можно обойти - в Делфи есть функция проверки на високосный год)
Как я и говорил - надо проверять. Я это делал когда-то в Делфи1 и часть функция пришлось переписать
Leonid Troyanovsky (2007-11-08 21:14:00) [124]
> Malik (08.11.07 20:37) [40]
> > Anatoly Podgoretsky © (08.11.07 19:43) [36]
> Я это знаю
Не верю.
--
Regards, LVT.
Malik (2007-11-08 20:37:00) [125]
> Anatoly Podgoretsky © (08.11.07 19:43) [36]
Я это знаю
Ладно ма держи:
S:=IntToStr(Round(DaysBetween(DateTimePicker2.Date,DateTimePicker1.Date)-MonthsBetween(DateTimePicker2.Date,DateTimePicker1.Date)*365.25/12))+'.'+IntToStr(MonthsBetween(DateTimePicker2.Date,DateTimePicker1.Date)mod 12)+'.'+IntToStr(YearsBetween(DateTimePicker2.Date,DateTimePicker1.Date));
Учти небольшой шлиф... и должно получиться, А так даёт максимум ошибку на день из-за округлений и не определённости величин месяцов, годов
Johnmen (2007-11-08 20:24:00) [126]
> SergeyIT © (08.11.07 19:37) [34]
Прошу прежде, чем решать эту "абстракцию" в "абстрактных" годах и "абстрактных" месяцах, ответить мне однозначно на [19], а также на:
Что получится
16.06.2007 - 15.07.2007 = ?
16.07.2007 - 15.08.2007 = ?
01.01.2004 - 01.03.2004 = ?
01.01.2004 - 29.02.2004 = ?
И ещё хотелось бы услышать, чем красный отличается от сладкого?
b z (2007-11-08 19:44:00) [127]
> скока дней в месяце, и в годе?
в каком? ;)
SergeyIT (2007-11-08 19:44:00) [128]
> скока дней в месяце, и в годе
В дельфи, если посмотрите сорсы, есть функции, которые дают однозначный ответ.
Anatoly Podgoretsky (2007-11-08 19:43:00) [129]
> Кто-нибудь скажет мне скока дней в месяце, и в годе?
На этот вопрос ответа нет, но есть решение в полных годах, месяцах
Некоторая сложность есть с февралем
Malik (2007-11-08 19:38:00) [130]Кто-нибудь скажет мне скока дней в месяце, и в годе?
SergeyIT (2007-11-08 19:37:00) [131]
>решал как получить дату
Нет конечно - разницу между датами в виде - число полных лет, месяцев, дней. Просто автор сформулировал некорректно - но в его примере видно, что ему надо.
Anatoly Podgoretsky (2007-11-08 19:29:00) [132]> SergeyIT (08.11.2007 19:14:32) [32]
То есть решал как получить дату 01.00.0001
SergeyIT (2007-11-08 19:14:00) [133]
> Никак не удается получить разничу между датами в формате
> dd.mm.yy.
Я когда-то и решал именно эту задачу.
Anatoly Podgoretsky (2007-11-08 19:10:00) [134]Ну так не дату же получать, а интервал
SergeyIT (2007-11-08 18:30:00) [135]Вспомнил, где это надо было - клиент хотел знать сколько лет, месяцев дней прошло с первого запуска программы.
Shirson_ (2007-11-08 18:26:00) [136]>Andy BitOff (ppc) (08.11.07 13:17) [6]
> Забыл сказать. КОНЕЧНО результат в стринг,ну я думал это и понятно. ;)
> какая должна быть разница между 05.11.2007 и 05.11.2006?
> 00.00.01
Date in Delphi - number of days that have passed since blah-blah-blah.
05.11.2007=39391
05.11.2006=39026
15.12.2008=39797
Res:=15.12.2008-05.11.2006 = 39797-39026=771 (days)
For Your type of result, must be used abstract "year" (365 days) and abstract mounth (30 days), because, it's not year or mount exactly, but just a measure.
procedure TForm1.Button1Click(Sender: TObject);
var d1,d2:tdatetime;
res:real;
Months,Years,Days:Integer;
c:string;
begin
d1:=strtodatetime(edit1.Text);
d2:=strtodatetime(edit2.Text);
Res:=d1-d2;
If res<0 then c:='-' else c:='';
Res:=abs(Res);
Years:= trunc(Res/365);
Months:= Trunc((Res - Years * 365) / 30);
Days:= trunc(Res-Years*365-Months*30); caption:=c+RightStr('0'+inttostr(Days),2)+'.'+RightStr('0'+inttostr(Months),2)+'.'+RightStr('000'+inttostr(Years),4);
end;
If you need not abstract measure, use engine [18]variant.
P.S. Sorry for English. No computers with russian available now.
SergeyIT (2007-11-08 18:07:00) [137]Когда-то давно решал подобную задачу.
Делал как-то вот так:
function DateDiff(dat1, dat2: TDate): String;
var
d1, d2, m1, m2, y1, y2: Word;
i, ii, id, im, iy: Integer;
dd, dw: TDate;
begin
dat1 := Floor(dat1); dat2 := Floor(dat2);
if dat2 < dat1 then
begin
dd := dat2; dat2 := dat1; dat1 := dd;
end;
DecodeDate(dat1, y1, m1, d1); DecodeDate(dat2, y2, m2, d2);
id := 0; im := 0; iy := 0;
dd := dat2;
while TRUE do
begin
dd := EncodeDate(y2 - iy - 1, m2, d2);
if dd < dat1 then break;
inc(iy);
end;
while TRUE do
begin
i := m2 - im - 1;
ii := y2 - iy;
if i <= 0 then
begin
i := 12;
dec(ii);
end;
dd := EncodeDate(ii, i, d2);
if dd < dat1 then break;
inc(im);
end;
dw := EncodeDate(y2 - iy, m2 - im, d2);
while TRUE do
begin
dd := dw - id - 1;
if dd < dat1 then break;
inc(id);
end;
Result := IntToStr(id) + '.' + IntToStr(im) + '.' + IntToStr(iy);
end;
Надо проверять.
Может можно оптимизировать...
Для остальных:
Такие задачи действительно встречаются. Надо знать разницу между датами в полных годах - месяцах - днях.
Решение тривиальное - вычитанием целых годов, месяцев, дней с проверкой выхода за нижнюю границу. Не оптимально, но дает результат.
vpbar (2007-11-08 17:00:00) [138]Это
> 05.11.2007 и 08.11.2007 должно получиться 03.00.00, но при
> работе с типом дата месяц (как и год) не может быть равен
> 0.
И ЭТО
> Забыл сказать. КОНЕЧНО результат в стринг,ну я думал это
> и понятно. ;)
> Потому что пересчет в другие единицы не подразумевается.
>
Немного противоречит друг другу.
Если второе, то просто раскладывай дату в дни месяцы и годы и вычитай. Получить чтото.
Anatoly Podgoretsky (2007-11-08 16:36:00) [139]> OP (08.11.2007 16:27:24) [24]
А автор озабочен нобелевкой.
Anatoly Podgoretsky (2007-11-08 16:35:00) [140]> Desdechado (08.11.2007 16:09:23) [23]
Очень весело получается в одинаковой ситуации, например с температурой, утром 24, вечером 26 градусов, по логике автора получается, что температура в больнице 2 градуса, или 1 января 0001 года.