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.
Может кто подскажет как это можно реализовать?


Anatoly Podgoretsky   (2007-11-09 13:07:00) [61]

Меня всю дорогу смущает, что интервал пытаются представить в формате dd.mm.yyyy - вам пользователей не жалко?


Думкин   (2007-11-09 13:06:00) [62]

> Anatoly Podgoretsky ©   (09.11.07 13:01) [102]

С головой у меня сейчас туго, поэтому так. :)
Есть контрол типа эдит - в нем написан текст. Берешь его оттуда - а он пустой. Зашибись. Это в том, в чем сейчас варюсь - не дельфи. Поэтому мозги просушиться повесил.


Anatoly Podgoretsky   (2007-11-09 13:01:00) [63]

> Думкин  (09.11.2007 12:37:39)  [99]

Я вообще то на твою голову расчитывал :-)
А если серьезно я взял твои данные и предложил альтернативу.


SergeyIT   (2007-11-09 12:57:00) [64]

Вот вариант (только без обработки 29 - 28 февраля) - считаются годы, месяцы, дни.

function DateDiff(dat1, dat2: TDate): String; //result = |dat2 - dat1|
var
  id, im, iy: Integer;
  dd, dw, dat3: TDate;
begin
 dat1 := Floor(dat1); dat2 := Floor(dat2);
 if dat2 < dat1 then
 begin
   dd := dat2; dat2 := dat1; dat1 := dd;
 end;
 im := 0; iy := 0;
 dat3 := dat2;
 while TRUE do
 begin
   dd := IncMonth(dat2, -12 * (iy + 1));
   if dd < dat1 then break;
   inc(iy);
   dat3 := dd;
 end;
 dw := dat3;
 while TRUE do
 begin
   dd := IncMonth(dat3, -(im + 1));
   if dd < dat1 then break;
   inc(im);
   dw := dd;
 end;
 id := Trunc(dw - dat1);
 Result := IntToStr(id) + '.' + IntToStr(im) + '.' + IntToStr(iy);
end;


Anatoly Podgoretsky   (2007-11-09 12:38:00) [65]

> korneley  (09.11.2007 11:26:27)  [87]

> В году - один год, а не 365 дней. А в месяце - месяц.

Ну тогда ответь на вопрос, получили интервал 365 дней, это сколько лет 1 или менее?


Думкин   (2007-11-09 12:37:00) [66]

> Anatoly Podgoretsky ©   (09.11.07 12:35) [97]

Ох уж твои клиенты...с толку сбиваешь ...


Anatoly Podgoretsky   (2007-11-09 12:36:00) [67]

> ЮЮ  (09.11.2007 10:59:22)  [82]

С первого по последнее число месяц не кончается, а кончается когда наступит первый день следующего месяца.


Anatoly Podgoretsky   (2007-11-09 12:35:00) [68]


> А зачем мне это адресовывать? Я вопроса не задавал и не
> отвечал.

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


Думкин   (2007-11-09 12:25:00) [69]

> ЮЮ ©   (09.11.07 12:12) [94]

А чтобы никто не ушел обиженным, считать надо так:

30 декабря 2001 и 3 февраля 2003
Разница 2 года 2 месяца и 3 дня.

:о)


Думкин   (2007-11-09 12:21:00) [70]

> ЮЮ ©   (09.11.07 12:12) [94]

1. Тогда задачу и надо уточнять у этих некоторых, желательно с привязкой к закону или, если закон не регулирует такие моменты или допускает вольность, обратиться в суд. Ибо если данные для  будут основываться только на моих наработках или палцетыканьем отдела кадров, то я или они могу такого понасчитать....
2. Числа не глянул, показалось, что 26 февраля и 27 марта, тогда по меркам февраля - всяко месяц, а по марту таки не дотягивает. что вписывается в объяснение.  
В таком случае, конечно - никаких месяцев при таком подходе.


ЮЮ   (2007-11-09 12:12:00) [71]

> Ни один человек в здравом уме серьезно к таким данным относиться
> не будет

Примерно так считают стаж, там где он нужен. И когда кому-то не хватит 1го дня для какой-либо льготы, то это уже не рюшечки.


> в этом случае 1 месяц и 1 день

Опять как-то противорешишь, ибо 26 меньше 27 - соответственно никаких месяцев.


Думкин   (2007-11-09 11:59:00) [72]


> т.е. между 30 января и 2 февраля МЕСЯЦ и ДНИ?

Я написал довольно доступно, но с точностью до наоборот. :)
2 меньше 30 - соответственно никаких месяцев.

А трудности в топку, в этом случае 1 месяц и 1 день. И на мерки по боку - все-равно задача не из разряда точных, а для рюшечек. Ни один человек в здравом уме серьезно к таким данным относиться не будет. Ее невозможно формализовать так, что бы все всегда были довольны. А потому делаем как проще. :)


ЮЮ   (2007-11-09 11:54:00) [73]

> Если номер дня начала, больше или равен чем номер дня конца,
> то месяц и дни, если меньше, то только дни считать. И все.

алгоритм.  

т.е. между 30 января и 2 февраля МЕСЯЦ и ДНИ?

Даже если и наоборот, то трудности остаются, например, с 27 февраля по 26 марта. 28 дней по меркам февраля - месяц, а по меркам марта только 28 дней


Думкин   (2007-11-09 11:41:00) [74]

> ЮЮ ©   (09.11.07 11:36) [89]

Если номер дня начала, больше или равен чем номер дня конца, то месяц и дни, если меньше, то только дни считать. И все.


korneley   (2007-11-09 11:37:00) [75]


> Просто хочется поговорить ?
Не то слово :))) А все таки [77] и [83]...


ЮЮ   (2007-11-09 11:36:00) [76]

> Почему с января - то? Тогда уж надо вычитать кол-во дней
> того месяца и того года с которого стартуем... Ну и так
> далее.


Это пожалуй лишнее. Полный месяцы внутри крайних дат периода и так месяцы, кадлый 12 из них дадут 1 год (то же касается и годов при многолетнем интервале).

Интерес представляют сумма оставшиеся дней месяца начальной даты интервала и дней, прошедших с начала месяцы конечной даты, которая  может изменяться от 2 и выше, где-то до 60. Остается найти точку разрыва, дающую нам 1 месяц и некоторое количество дней. Сформуриловав это правидо, наиболее приемлимое для предметной области, мы и получим алгоритм.


MsGuns   (2007-11-09 11:30:00) [77]

>korneley ©   (09.11.07 11:26) [87]

Просто хочется поговорить ?


korneley   (2007-11-09 11:26:00) [78]


> то без некоторых условностей (например считать, что в месяце
> 30 дней, а в году 365 дней) не обойтись

В году - один год, а не 365 дней. А в месяце - месяц.


korneley   (2007-11-09 11:23:00) [79]


>  а потом отнять от него сначала кол-во дней в январе
Почему с января - то? Тогда уж надо вычитать кол-во дней того месяца и того года с которого стартуем... Ну и так далее.


MsGuns   (2007-11-09 11:20:00) [80]

ИМХО, человек путает две достаточно разные вещи: даты и интервал в единицах времени.
Для первого случая вполне достаточно TDateTime, для второго - TTimeStamp
Если надо определить интервал между достаточно отстоящими друг от друга датами, то без некоторых условностей (например считать, что в месяце 30 дней, а в году 365 дней) не обойтись. Если интервал небольшой (например, время вычисления чего-нибудь), то вполне подходит "измерение" в сутках, часах, минутах и секундах


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

Наверх

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