![]() |
| ||
|
|
Новости |
Поиск |
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.
Может кто подскажет как это можно реализовать?
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 дней) не обойтись. Если интервал небольшой (например, время вычисления чего-нибудь), то вполне подходит "измерение" в сутках, часах, минутах и секундах