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

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

Разница между датами [D7, XP]


Страницы:   1 2 3 4 5 6 7 8 9

Andy BitOff (ppc) ©   (2007-11-08 13:07:00) 

Здравствуйте.
Что-то у меня уже башка не варит, сижу парюсь и шарики за ролики заходят...
Никак не удается получить разничу между датами в формате 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 года.


Страницы:   1 2 3 4 5 6 7 8 9

Наверх

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