Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.09;
Скачать: CL | DM;

Вниз

Разница между датами   Найти похожие ветки 

 
Andy BitOff (ppc)   (2007-11-08 13:07) [0]

Здравствуйте.
Что-то у меня уже башка не варит, сижу парюсь и шарики за ролики заходят...
Никак не удается получить разничу между датами в формате dd.mm.yy.
Например.
05.11.2007 и 08.11.2007 должно получиться 03.00.00, но при работе с типом дата месяц (как и год) не может быть равен 0.
Может кто подскажет как это можно реализовать?


 
Johnmen ©   (2007-11-08 13:09) [1]

Никак. Разница между датами есть интервал, измеряемый в фиксированных единицах. Напр. в секундах или сутках.


 
Skyle ©   (2007-11-08 13:10) [2]

А что хочется получить?
какая должна быть разница между 05.11.2007 и 05.11.2006?


 
clickmaker ©   (2007-11-08 13:12) [3]


> должно получиться 03.00.00

в смысле, нужно отдельно представлять сколько разница в днях, месяцах и годах?
тогда можно свою структуру завести
TDateDiff = record
 Days: integer;
 Months: integer;
 Years: integer;
end;
ну и форматировать в строку


 
Ega23 ©   (2007-11-08 13:12) [4]


> какая должна быть разница между 05.11.2007 и 05.11.2006?


525600 минут


 
Skyle ©   (2007-11-08 13:13) [5]


> Ega23 ©   (08.11.07 13:12) [4]
> > какая должна быть разница между 05.11.2007 и 05.11.2006?
> 525600 минут

В смысле минус?


 
Andy BitOff (ppc)   (2007-11-08 13:17) [6]

Забыл сказать. КОНЕЧНО результат в стринг,ну я думал это и понятно. ;)

> какая должна быть разница между 05.11.2007 и 05.11.2006?
00.00.01
А что это не очевидно?
Визуально и поработав мозгами это очевидно, а вот программная реализация, чего-то мне не дается.


 
engine ©   (2007-11-08 13:19) [7]

> [0] Andy BitOff (ppc)   (08.11.07 13:07)

function DatesBetween (FirstDate, SecondDate : TDateTime) : String;
begin
Result := IntToStr(DaysBetween(FirstDate, SecondDate)) + "." +
          IntToStr(MonthsBetween(FirstDate, SecondDate)) + "." +
          IntToStr(YearsBetween(FirstDate, SecondDate));
end;


Что-то типа того, не запускал, но должно работать.


 
Desdechado ©   (2007-11-08 13:28) [8]

Интервал неможет быть представлен в формате даты, т.к. месяцы, годы имеют разную длину.


 
Sergey13 ©   (2007-11-08 13:36) [9]

> [6] Andy BitOff (ppc)   (08.11.07 13:17)
> 00.00.01
> А что это не очевидно?

А тебя не смущает, что столь "очевидный" результат пересчитанный в другие единицы (дни, минуты и т.д.) для разных лет будет отличаться друг от друга?


 
stud ©   (2007-11-08 13:40) [10]

engine ©   (08.11.07 13:19) [7]

интересный должен результат получиться))))))


 
Andy BitOff (ppc)   (2007-11-08 13:50) [11]

> А тебя не смущает,...
Нет. Не смущает. Потому что пересчет в другие единицы не подразумевается. Я же указал в первом посте в каком формате нужен выход и это конечный выход. Далее с этими данными никаких действий производиться не будет.


 
Johnmen ©   (2007-11-08 13:53) [12]


> engine ©   (08.11.07 13:19) [7]

"Работать" это что? Отсутствие ошибок в программе? Или правильный результат?


 
Johnmen ©   (2007-11-08 13:54) [13]


> Далее с этими данными никаких действий производиться не
> будет.

М.б. тебе они и не нужны вовсе?


 
Andy BitOff (ppc)   (2007-11-08 14:05) [14]

Johnmen © (08.11.07 13:54) [13]
Ну ты же умный человек. Неужели я бы стал тратить свое время, трафик и ваше время, если бы мне это было не надо.
Обычно (если, что бывает редко) я что-то здесь спрашиваю, то это значит, что я действительно зашел в тупик и не вижу выхода.
Я переписал уже три или четыре раза функцию для решения этой задачи, но так и не приуспел в этом. Поэтому и обратился сюда.
Сейчас обдумываю еще вариант, но мозги уже закипают.


 
engine ©   (2007-11-08 14:06) [15]

> [12] Johnmen ©   (08.11.07 13:53)

Мдя, не подумал. Результат интересный получился. )))


 
Johnmen ©   (2007-11-08 14:08) [16]


> Andy BitOff (ppc)   (08.11.07 14:05) [14]

Дело в том, что неглупые грамотные люди тебе уже и сказали и намекнули, что никак. Поясняю - ни один, тобой придуманный "алгоритм", не будет правильным. Т.е. не будет давать верных с любой т.з. решений.


 
Andy BitOff (ppc)   (2007-11-08 14:21) [17]

Johnmen © (08.11.07 14:08) [16]
Неверю.
Любую задачу, тем более эту, можно решить/запрограммировать. Другое дело сколько понадобится для этого ресурсов (чел/часов, нервов и т.п).


 
engine ©   (2007-11-08 14:36) [18]

> [17] Andy BitOff (ppc)   (08.11.07 14:21)

function DatesBetween (FirstDate, SecondDate : TDateTime) : String;
var
  CountDays, CountMonth, CountYear : Integer;
  i, Year1, Year2 : Integer;
begin
 CountYear := YearOf(SecondDate) — Yearof(FirstDate);
 if MonthOf(SecondDate) < MonthOf(FirstDate) then
  begin
    dec(CountYear);
    CountMonth := 12 &#151; MonthOf(FirstDate) + MonthOf(SecondDate)
  end
  else
    CountMonth := MonthOf(SecondDate) &#151; MonthOf(FirstDate);
 if DayOf(SecondDate) < DayOf(FirstDate) then
  begin
    dec(CountMonth);
    CountDays := DaysInMonth(FirstDate)  &#151; DayOf(FirstDate) + DayOf(SecondDate);
  end else
   CountDays := DayOf(SecondDate) &#151; DayOf(FirstDate);
 Result := IntToStr(CountDays) + "." +
           IntToStr(CountMonth) + "." +
           IntToStr(CountYear);
end;


Вот вариант. Только требует обработки напильником


 
Johnmen ©   (2007-11-08 14:54) [19]


> engine ©   (08.11.07 14:36) [18]

Что получится
29.02.1996 - 28.02.1995 = ?
01.03.1996 - 28.02.1995 = ?


 
engine ©   (2007-11-08 15:05) [20]

> [19] Johnmen ©   (08.11.07 14:54)

Ну, я ж и говорю, немного напильником доработать.
В остальных случаях вроде правильно считает.


 
Leonid Troyanovsky ©   (2007-11-08 15:29) [21]


> Andy BitOff (ppc)   (08.11.07 14:21) [17]

> Неверю.
> Любую задачу, тем более эту, можно решить/запрограммировать.

А и задачи-то никакой нет.
Скажем, что это некорректная постановка.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2007-11-08 15:42) [22]


> Неужели я бы стал тратить свое время,
>  трафик и ваше время, если бы мне это было не надо.

Не функции надо переписывать, а разработать теорию, по которой интервал 30 дней можно будет преобразовать в любую дату, разработаешь - нобелевку получишь.


 
Desdechado ©   (2007-11-08 16:09) [23]

Дата - это точка на оси времени. Разница между датами - это отрезок между точками. Нельзя отрезок представить в виде одной точки.


 
OP   (2007-11-08 16:27) [24]


> Дата - это точка на оси времени. Разница между датами -
> это отрезок между точками. Нельзя отрезок представить в
> виде одной точки.

Согласен, максимум что можно - посчитать разницу между датами в днях... но такой ведь вариант его не устраивает...


 
Anatoly Podgoretsky ©   (2007-11-08 16:35) [25]

> Desdechado  (08.11.2007 16:09:23)  [23]

Очень весело получается в одинаковой ситуации, например с температурой, утром 24, вечером 26 градусов, по логике автора получается, что температура в больнице 2 градуса, или 1 января 0001 года.


 
Anatoly Podgoretsky ©   (2007-11-08 16:36) [26]

> OP  (08.11.2007 16:27:24)  [24]

А автор озабочен нобелевкой.


 
vpbar ©   (2007-11-08 17:00) [27]

Это

> 05.11.2007 и 08.11.2007 должно получиться 03.00.00, но при
> работе с типом дата месяц (как и год) не может быть равен

> 0.


И ЭТО

> Забыл сказать. КОНЕЧНО результат в стринг,ну я думал это
> и понятно. ;)
>  Потому что пересчет в другие единицы не подразумевается.
>

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


 
SergeyIT ©   (2007-11-08 18:07) [28]

Когда-то давно решал подобную задачу.
Делал как-то вот так:

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;

Надо проверять.
Может можно оптимизировать...

Для остальных:
Такие задачи действительно встречаются. Надо знать разницу между датами в полных годах - месяцах - днях.
Решение тривиальное - вычитанием целых годов, месяцев, дней с проверкой выхода за нижнюю границу. Не оптимально, но дает результат.


 
Shirson_   (2007-11-08 18:26) [29]

>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:30) [30]

Вспомнил, где это надо было - клиент хотел знать сколько лет, месяцев дней прошло с первого запуска программы.


 
Anatoly Podgoretsky ©   (2007-11-08 19:10) [31]

Ну так не дату же получать, а интервал


 
SergeyIT ©   (2007-11-08 19:14) [32]


> Никак не удается получить разничу между датами в формате
> dd.mm.yy.

Я когда-то и решал именно эту задачу.


 
Anatoly Podgoretsky ©   (2007-11-08 19:29) [33]

> SergeyIT  (08.11.2007 19:14:32)  [32]

То есть решал как получить дату 01.00.0001


 
SergeyIT ©   (2007-11-08 19:37) [34]


>решал как получить дату

Нет конечно - разницу между датами в виде - число полных лет, месяцев, дней. Просто автор сформулировал некорректно - но в его примере видно, что ему надо.


 
Malik   (2007-11-08 19:38) [35]

Кто-нибудь скажет мне скока дней в месяце, и в годе?


 
Anatoly Podgoretsky ©   (2007-11-08 19:43) [36]


> Кто-нибудь скажет мне скока дней в месяце, и в годе?

На этот вопрос ответа нет, но есть решение в полных годах, месяцах
Некоторая сложность есть с февралем


 
b z   (2007-11-08 19:44) [37]


> скока дней в месяце, и в годе?

в каком? ;)


 
SergeyIT ©   (2007-11-08 19:44) [38]


> скока дней в месяце, и в годе

В дельфи, если посмотрите сорсы, есть функции, которые дают однозначный ответ.


 
Johnmen ©   (2007-11-08 20:24) [39]


> 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 = ?

И ещё хотелось бы услышать, чем красный отличается от сладкого?


 
Malik   (2007-11-08 20:37) [40]


> 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));
Учти небольшой шлиф... и должно получиться, А так даёт максимум ошибку на день из-за округлений и не определённости величин месяцов, годов


 
Leonid Troyanovsky ©   (2007-11-08 21:14) [41]


> Malik   (08.11.07 20:37) [40]

> > Anatoly Podgoretsky ©   (08.11.07 19:43) [36]

> Я это знаю

Не верю.

--
Regards, LVT.


 
SergeyIT   (2007-11-08 22:18) [42]


> Что получится

С моей функцией
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 и часть функция пришлось переписать


 
Johnmen ©   (2007-11-08 23:35) [43]


> 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-09 00:06) [44]


> Johnmen ©   (08.11.07 23:35) [43]
> ... все твои ф-ии,

Хам и демагог. Предлагаю Вам написать программу для расчета вашего возраста в годах, месяцах, днях - если не можете - то вам здесь не место, ведь помогать новичкам - это обмен информацией, а не словесным поносом. (я свой возраст подсчитал = 20.6.53)
А автору темы просто надо проверить и подстроить под то, что ему надо (и под тот Дельфи, который он использует).


 
Dmitro   (2007-11-09 00:16) [45]

function CarToInt(dt: TDate): Cardinal;
var
 y, m, d: string;
begin
 y:= formatdatetime(dt, "yyyy");
 m:= formatdatetime(dt, "mm");
 d:= formatdatetime(dt, "dd");
 y:= y + m + d;
 Result:= StrToInt(y)
end;
Таким образом можно сравнивать любые даты т. е.:
CarToInt("02/09/01") - CarToInt("01/09/01") = 1
Кавычки здесь образо поставлены - туда надо реальные даты передавать!


 
korneley ©   (2007-11-09 00:29) [46]


> Dmitro   (09.11.07 00:16) [45]
>...Таким образом можно сравнивать любые даты...

С любым результатом.... Прикольно... :)

> CarToInt("02/09/01") - CarToInt("01/09/01") = 1

а еще можно просто вычесть "таймстамп" друг из друга и получить разницу в днях...


 
SergeyIT   (2007-11-09 00:36) [47]


> Andy BitOff

Хочу добавить, что в моей функции надо обработать правильно  в d2 не только 29 февраля, но и 30 и 31 число месяца (январь, март...), а может и 29.
(Как? - подумайте.)


 
Dmitro   (2007-11-09 00:43) [48]


> korneley ©   (09.11.07 00:29) [46]
>
> > Dmitro   (09.11.07 00:16) [45]
> >...Таким образом можно сравнивать любые даты...
>
> С любым результатом.... Прикольно... :)
>
> > CarToInt("02/09/01") - CarToInt("01/09/01") = 1
>
> а еще можно просто вычесть "таймстамп" друг из друга и получить
> разницу в днях...

НАЗВАНИЕ ФОРУМА ПРОЧИТАЙ!!!


 
korneley ©   (2007-11-09 00:48) [49]


> Dmitro   (09.11.07 00:43) [48]


> НАЗВАНИЕ ФОРУМА ПРОЧИТАЙ!!!

Упс!!! Был не прав, вспылил. Опять же, считаю своё поведение безобразной ошибкой. Количество дней в месяце пошёл считать по костяшкам рук. Точно помню: впадина - меньше 31 дня. %)


 
Dmitro   (2007-11-09 00:54) [50]


> korneley ©   (09.11.07 00:48) [49]

Не важно! Я эту хрень вспомнил из VB, т.е. VB в Excell. Там при смене версий этой хр.......и API иногда показывают разные результаты - вот и пришлось делать такие пируэты.


 
Германн ©   (2007-11-09 01:21) [51]


> Dmitro   (09.11.07 00:16) [45]
>
> function CarToInt(dt: TDate): Cardinal;
> var
>  y, m, d: string;
> begin
>  y:= formatdatetime(dt, "yyyy");
>  m:= formatdatetime(dt, "mm");
>  d:= formatdatetime(dt, "dd");
>  y:= y + m + d;
>  Result:= StrToInt(y)
> end;
> Таким образом можно сравнивать любые даты т. е.:
> CarToInt("02/09/01") - CarToInt("01/09/01") = 1

Я не такой вспыльчивый как korneley ©, поэтому просто спрошу. А какое отношение имеет десятичная система счисления к многосистемному способу счисления времени и к совершенно безсистемному календарю?
Ты бы хоть сам подумал головой хоть чуть-чуть. Сравни например своим способом даты "01/01/01" и "01/02.01".
Только не удивляйся ещё и сообщениям компилятора об ошибках. Ты и стандартные функции ещё пока не знаешь.
Т.е. "КОНФЕРЕНЦИЯ" - "Начинающим" конечно. Но это не оправдание "начинающих" ответов, которые перед постированием на форум не проверяются на своём компьютере.


 
Johnmen ©   (2007-11-09 01:21) [52]


> SergeyIT   (09.11.07 00:06) [44]

Прошу заметить, что Вы пока только повествуете о какой-то мифической функции. Которая якобы работает без runtime ошибок и якобы выводит достоверные данные. При этом самой ф-ии не приводите. В классической философии именно это называется демагогией.
А в остальном Ваша юношеская мнительность не позволяет Вам почему-то ответить на простые, казалось бы, для Вас вопросы:
1.
15.06.2007 - 15.07.2007 = ?
15.06.2007 - 16.07.2007 = ?
15.06.2007 - 17.07.2007 = ?
15.07.2007 - 15.08.2007 = ?
15.07.2007 - 16.08.2007 = ?
15.07.2007 - 17.08.2007 = ?
2.
Что выше - кислый или темный?

ЗЫ
Впрочем, на второй можете не отвечать.


 
korneley ©   (2007-11-09 01:27) [53]

Имхо тема исчерпана, т.к. все так или иначе высказались, что разница в днях может быть по разному интерпретирована в разницу в днях.месяцах.годах. Все от первой и второй даты зависит. А именно от дня, месяца и, как не странно, года. ;)


 
korneley ©   (2007-11-09 01:29) [54]

ЗЫ: А выше - тёмный. Тёмная сторона Силы привлекает сильнее...


 
Германн ©   (2007-11-09 01:41) [55]


> korneley ©   (09.11.07 01:27) [53]
>
> Имхо тема исчерпана

Имхо, тема будет исчерпана только после того как автор темы осознает, что вышеописанное:

> Johnmen ©   (08.11.07 14:08) [16]
>
>
> > Andy BitOff (ppc)   (08.11.07 14:05) [14]
>
> Дело в том, что неглупые грамотные люди тебе уже и сказали
> и намекнули, что никак. Поясняю - ни один, тобой придуманный
> "алгоритм", не будет правильным. Т.е. не будет давать верных
> с любой т.з. решений.
> <Цитата>
>
> Andy BitOff (ppc)   (08.11.07 14:21) [17]
>
> Johnmen © (08.11.07 14:08) [16]
> Неверю.
> Любую задачу, тем более эту, можно решить/запрограммировать.
>  Другое дело сколько понадобится для этого ресурсов (чел/часов,
>  нервов и т.п).
>

означает очень большой (даже скажу слишком большой геморрой). А для чего так нужно мучиться не понятно. Может стоит упростить задачу?
(Меня как-то мой псевдоначальник попросил выводить в СтатусБаре количество минут, часов, дней, МЕСЯЦЕВ, ЛЕТ которые проработала программа :)


 
Dmitro   (2007-11-09 01:47) [56]


> Германн ©   (09.11.07 01:21) [51]

Я говорил лишь о СРАВНЕНИИ дат..., уважаемый Германннн


 
Johnmen ©   (2007-11-09 01:52) [57]


> Dmitro   (09.11.07 01:47) [56]
> Я говорил лишь о СРАВНЕНИИ дат...

Для лишь сравнения дат никаких преобразований вовсе не надо.


 
Германн ©   (2007-11-09 02:06) [58]


> Dmitro   (09.11.07 01:47) [56]
>
>
> > Германн ©   (09.11.07 01:21) [51]
>
> Я говорил лишь о СРАВНЕНИИ дат..., уважаемый Германннн
>

Ну тогда в подобных случаях употребляй неофициальный тэг" <offtop>. Поскольку твой пост не имеет никакого отношения к сабжу. Да и всё-таки изучи синтаксис функции FormatDateTime.
А про сравнение дат см.
> Johnmen ©   (09.11.07 01:52) [57]


 
Dmitro   (2007-11-09 02:40) [59]


> Германн ©   (09.11.07 02:06) [58]

Учел Ваши комментарии:
 y:= strtoint(formatdatetime("yyyy", datetimepicker1.date));
 y:= y - strtoint(formatdatetime("yyyy", datetimepicker2.date));
 y:= y * 365;
 m:= strtoint(formatdatetime("mm", datetimepicker1.date));
 m:= m - strtoint(formatdatetime("mm", datetimepicker2.date));
 if m < 0 then
   m:= m * -1;
 y:= y + m * 30;
 y:= y + strtoint(formatdatetime("dd", datetimepicker1.date)) - strtoint(formatdatetime("dd", datetimepicker2.date));

Разумеется DateTimePickerr2 всегда < DateTimePickerr1 (Value).
Функция не абсолютна и не точна, но раскрывает алгоритм вычитания дат.
Готов выслушать критику и советы......


 
Германн ©   (2007-11-09 02:54) [60]


> Функция не абсолютна и не точна, но раскрывает алгоритм
> вычитания дат.
> Готов выслушать критику и советы......
>

А чего тут критиковать? Сам же сказал, что "не абсолютна и не точна". Прочитай ещё раз всю ветку. Поймёшь что ты не первый и далеко не первый, кто именно такую формулировку применил.


 
Германн ©   (2007-11-09 03:05) [61]

Пардон. Отнёсся к [59] слишком "бездумно". Однако стоило ужесточить мнение.
Сия функция не только
> не абсолютна и не точна
, но и не
> раскрывает алгоритм вычитания дат
.


 
Dmitro   (2007-11-09 03:18) [62]


>  но и не
> > раскрывает алгоритм вычитания дат

Как раз-то и РАСКРЫВАЕТ Ваш же "многосистемный" метод. Сколько читаю эту ветку - еще не увидел ни одного абсолютного и верного ответа на вопрос (в любом варианте есть исключения).
Думаю - напишу func"s для работы с дт/вр.


 
d@nger   (2007-11-09 08:07) [63]

Извените, меня конечно, а разве нельзя просто сделать так:

function DatesBetween (FirstDate, SecondDate : TDateTime) : String;
var y1,m1,d1,y2,m2,d2:word;y,m,d:string;
begin
 decodedate(firstdate,y1,m1,d1);
 decodedate(seconddate,y2,m2,d2);
 y:=inttostr(y1-y2);
 m:=inttostr(m1-m2);
 d:=inttostr(d1-d2);
 result:=d+"."+m+"."+y;
end;


а привести допустим день 1 в вид 01, месяц 8 в вид 08, а год 1 в вид 0001, не составит труда.....

тока не кидайтесь камнями...если я не прав....


 
homm ©   (2007-11-09 08:19) [64]

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

Имеено эту фразу видят люди в качестве описания вопроса. Очень емко и информативно, главное сразу понятно что нужно автору, можно даже в ветку не заходить.


 
Думкин ©   (2007-11-09 08:19) [65]


> d@nger   (09.11.07 08:07) [63]


> Johnmen ©   (08.11.07 14:54) [19]
>
> > engine ©   (08.11.07 14:36) [18]
>
> Что получится
> 29.02.1996 - 28.02.1995 = ?
> 01.03.1996 - 28.02.1995 = ?


 
Skyle ©   (2007-11-09 09:08) [66]


> Думкин ©   (09.11.07 08:19) [65]

Я подобный вопрос задал ещё в [2]. Автор не хочет уточнить :(


 
Leonid Troyanovsky ©   (2007-11-09 09:20) [67]


> Skyle ©   (09.11.07 09:08) [66]

> Я подобный вопрос задал ещё в [2]. Автор не хочет уточнить
> :(

Дык, он же не в состоянии (см. анамнез),
у него ж паралич мыслительной мышцы.

Кста, видимо, это заразно.

--
Regards, LVT.


 
Думкин ©   (2007-11-09 09:29) [68]

> Skyle ©   (09.11.07 09:08) [66]

У тебя не так интересно. A вот с кодом того, кому писал - это интереснее выходит. Для 1 марта.


 
SergeyIT   (2007-11-09 09:47) [69]


> Johnmen ©   (09.11.07 01:21) [52]
>
> Прошу заметить, что Вы пока только повествуете о какой-то
> мифической функции. Которая якобы работает без runtime ошибок
> и якобы выводит достоверные данные. При этом самой ф-ии
> не приводите.

А не пора ли Вам проснуться? - пост [28] с учетом [47].


 
Думкин ©   (2007-11-09 09:57) [70]

> SergeyIT   (09.11.07 09:47) [69]

Вы бы все-таки ответили на его 19 пост. А то некрасиво как-то.


 
Johnmen ©   (2007-11-09 10:06) [71]


> SergeyIT   (09.11.07 09:47) [69]

Я, конечно понимаю, что чукча не читатель, чукча писатель, но попробую ещё раз, последний:
1.
SergeyIT ©   (08.11.07 18:07) [28]
Надо проверять.

SergeyIT   (08.11.07 22:18) [42]
01.01.2004 - 29.02.2004 = ошибка в Дельфи5
Как я и говорил - надо проверять.

Johnmen ©   (09.11.07 01:21) [52]
Вы пока только повествуете о какой-то мифической функции. Которая якобы работает без runtime ошибок и якобы выводит достоверные данные.


Где работающая ф-ия, выдающая достоверные результаты?

2.
15.06.2007 - 16.07.2007 = ?
15.06.2007 - 17.07.2007 = ?
15.07.2007 - 16.08.2007 = ?
15.07.2007 - 17.08.2007 = ?


 
SergeyIT   (2007-11-09 10:06) [72]

По-моему так
29.02.1996 - 28.02.1995 = 0.0.1
01.03.1996 - 28.02.1995 = 1.0.1
и так
28.02.1996 - 28.02.1995 = 0.0.1
Эти исключения надо решить, как обработать - это к автору темы - смотря что ему надо


 
Johnmen ©   (2007-11-09 10:13) [73]


> SergeyIT   (09.11.07 10:06) [72]
> По-моему так
> 29.02.1996 - 28.02.1995 = 0.0.1

Т.е. всего 1 (одни) сутки разницы???
Мило...:)


 
Думкин ©   (2007-11-09 10:15) [74]


> Johnmen ©   (09.11.07 10:13) [73]

1 год. :)


 
Johnmen ©   (2007-11-09 10:20) [75]


> Думкин ©   (09.11.07 10:15) [74]
> 1 год. :)

А-а-а... У него года в конце.


> SergeyIT   (09.11.07 10:06) [72]
> По-моему так
> 29.02.1996 - 28.02.1995 = 0.0.1
> 28.02.1996 - 28.02.1995 = 0.0.1

А это как понимать? Куда сутки исчезли?


 
ЮЮ ©   (2007-11-09 10:31) [76]

> [72] SergeyIT   (09.11.07 10:06)
> По-моему так


По моему лучше так:
0.0.1 = 27.02.1996 - 28.02.1995, т.к. с 28.02.1995 по 27.02.1996 (включительно) ровно 1 год.
Соответственно, для 28.02.1995, имеем
1.0.1 - 28.02.1996  
2.0.1 - 29.02.1996
3.0.1 - 01.03.1996
...
0.1.1 - 27.03.1996

Кажеттся, что затруднения возникают, когда дней месяце начала перриода больще, чем дней конца перриода.
Что считать "ровно через месяц", начиная с 31.01, а с 30.01.

Но с доугой стороны имеет место
30.01 ... 29.02 = 0.1.x
тогда
31.01 ... 29.02 = 30.0.x (ну и что что в феврале 30 дней не бывает, зато функция однозначная ддя любой даты)


 
korneley ©   (2007-11-09 10:33) [77]

Неожиданно подумалось:" Если мы оперируем абстрактными "год" и "месяц", то со второгого марта по первое (включительно) пройдет один год, независимо от того, високосный он или нет, а с первого числа любого месяца по последнее - один месяц". Во как.


 
korneley ©   (2007-11-09 10:40) [78]

Поэтому получаем год = 12 месяцев, и по барабану сколько в этих месяцах дней. В [63] такой подход озвучен, правда только подход, сам пример нерабочий, потому что, если из 9 - го месяца вычесть 10 - й будет не -1, а 12 месяцев.


 
Anatoly Podgoretsky ©   (2007-11-09 10:52) [79]

> Думкин  (09.11.2007 10:15:14)  [74]

Что бы нагляднее
28.02.1996 - 28.02.1995 = 0.0.1 ???
29.02.1996 - 28.02.1995 = 0.0.1 ???
и
28.02.1997 - 28.02.1996 = 0.0.1
28.02.1997 - 29.02.1996 = ?


 
Anatoly Podgoretsky ©   (2007-11-09 10:54) [80]

> korneley  (09.11.2007 10:33:17)  [77]

> а с первого числа любого месяца по последнее - один месяц". Во как.

С чего бы


 
Думкин ©   (2007-11-09 10:56) [81]

> Anatoly Podgoretsky ©   (09.11.07 10:52) [79]

А зачем мне это адресовывать? Я вопроса не задавал и не отвечал. Я лишь заметил, что год и день стоят не на тех местах.


 
ЮЮ ©   (2007-11-09 10:59) [82]

[80] Anatoly Podgoretsky ©   (09.11.07 10:54)
> С чего бы

Т.е. месяц февраль, это не только с 1 по последнее число февраля, но и последний день января и первый день марта?


 
korneley ©   (2007-11-09 11:04) [83]


> Anatoly Podgoretsky ©   (09.11.07 10:54) [80]
> > korneley  (09.11.2007 10:33:17)  [77]
>> а с первого числа
>> любого месяца по последнее - один месяц". Во как.
> С чего бы

А хотя бы с того, что название месяца не изменилось :) Рискну повторить еще раз: если надо узнать разницу дат в днях.месяцах.годах, то и оперировать надо днями, месяцами и годами, а не количеством пройденных дней.


 
Dib@zol ©   (2007-11-09 11:12) [84]

Рискну предположить: а если вычислить кол-во дней между датами, а потом отнять от него сначала кол-во дней в январе, затем в феврале бОльшего года, затем - в марте итд пока количество дней не станет меньше количества дней в том месяце, чьи дни отнимаем. Если все месяцы отняты, а дни ещё не кончились, прибавляем год. И февраль уже считаем по [больший_год - 1] году. Ет цетера.

Может подойдёт?


 
MsGuns ©   (2007-11-09 11:20) [85]

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


 
korneley ©   (2007-11-09 11:23) [86]


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


 
korneley ©   (2007-11-09 11:26) [87]


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

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


 
MsGuns ©   (2007-11-09 11:30) [88]

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

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


 
ЮЮ ©   (2007-11-09 11:36) [89]

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


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

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


 
korneley ©   (2007-11-09 11:37) [90]


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


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

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

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


 
ЮЮ ©   (2007-11-09 11:54) [92]

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

алгоритм.  

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

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


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


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

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

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


 
ЮЮ ©   (2007-11-09 12:12) [94]

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

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


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

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


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

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

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


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

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

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

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

:о)


 
Anatoly Podgoretsky ©   (2007-11-09 12:35) [97]


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

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


 
Anatoly Podgoretsky ©   (2007-11-09 12:36) [98]

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

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


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

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

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


 
Anatoly Podgoretsky ©   (2007-11-09 12:38) [100]

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

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

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


 
SergeyIT ©   (2007-11-09 12:57) [101]

Вот вариант (только без обработки 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 13:01) [102]

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

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


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

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

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


 
Anatoly Podgoretsky ©   (2007-11-09 13:07) [104]

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


 
Johnmen ©   (2007-11-09 13:16) [105]

> Думкин ©   (09.11.07 12:25) [96]

Крута :)))


 
Johnmen ©   (2007-11-09 13:22) [106]


> SergeyIT ©   (09.11.07 12:57) [101]

1. 15.06.2007 - 15.07.2007 = 0.1.0
2. 15.07.2007 - 15.08.2007 = 0.1.0
При этом
1. = 30 суток
2. = 31 сутки
далее 31>30, но что мы видим??? 0.1.0 = 0.1.0 !!!

Как тебя понимать, Саид? (с)


 
Sergey13 ©   (2007-11-09 13:23) [107]

Предлагаю ввести универсальную единицу интервала времени - ГАК.
IF YearsBetween(FirstDate, SecondDate)>1 THEN Result := "Год с ГАКОМ";


 
korneley ©   (2007-11-09 13:48) [108]


> Ну тогда ответь на вопрос, получили интервал 365 дней, это
> сколько лет 1 или менее?
Дык, елы-палы, братушка, я ж объяснял, что не надо интервал в днях получать, ну не интересно ему, что прошло N дней, а интересно, что год. Или месяц. Или неделя (во! в неделе точно = 7 дней). Если человеку надо в его единицах результат выдать (уж не важно почему), то и пользовать надо эти единицы


 
Leonid Troyanovsky ©   (2007-11-09 13:58) [109]


> korneley ©   (09.11.07 13:48) [108]

> Дык, елы-палы, братушка, я ж объяснял, что не надо интервал
> в днях получать, ну не интересно ему, что прошло N дней,
>  а интересно, что год. Или месяц. Или неделя (во! в неделе
> точно = 7 дней). Если человеку надо в его единицах результат
> выдать (уж не важно почему), то и пользовать надо эти единицы

Так вот пусть оный человек и предлагает методику расчета того,
что его интересует (и под этим подписывается).
Ну, а дальше - дело техники.

Бесплатно же можно получить лишь то, что до недель вкл.

--
Regards, LVT.


 
korneley ©   (2007-11-09 14:01) [110]


> Leonid Troyanovsky ©   (09.11.07 13:58) [109]

Ну да. А пока методику пишет, глядишь - и нет проблемы :)


 
SergeyIT   (2007-11-09 14:20) [111]


> Как тебя понимать, Саид? (с)

А так - месяц назад - это 9 октября 2007 года - и не важно сколько дней в месяце. Так и функция IncMonth в Дельфи работает.


 
korneley ©   (2007-11-09 14:32) [112]


> Так и функция IncMonth в Дельфи работает.

Во! Есть такая функция! Берем начальную дату и лепим IncMonth, пока не станет больше конечной. На 12 месяцев добавляем год. Дни - разница значения в предпоследней итерации от конечной даты.


 
Anatoly Podgoretsky ©   (2007-11-09 14:34) [113]

> korneley  (09.11.2007 13:48:48)  [108]

Так получает то он интервал в днях, нет интервала в таких изощренных форматах как dd.mm.yyyy


 
Anatoly Podgoretsky ©   (2007-11-09 14:35) [114]

> SergeyIT  (09.11.2007 14:20:51)  [111]

За то для 31.10.2007 месяц назад не 31.09.2007
и обратно - месяц вперед туже дату не получишь


 
Anatoly Podgoretsky ©   (2007-11-09 14:36) [115]

> korneley  (09.11.2007 14:32:52)  [112]

Все бы вам лепить, а у заказчика совсем другое представление, что такое месяц и год, необязательно совпадающее с твоим и возможно (вероятнее) он не сможет объяснить какое.


 
korneley ©   (2007-11-09 14:42) [116]


> и обратно - месяц вперед туже дату не получишь
Естественно, 31.10 - месяц вперёд - 30.11, о чем и речь. "И это правильно" (с)


 
korneley ©   (2007-11-09 14:53) [117]


>  возможно (вероятнее) он не сможет объяснить какое.

Не, ну это уже другая тема и решается не программированием, а, как минимум, переговорами с постановкой задачи и написанием ТЗ, в котором год будет хоть 100 суток, а сутки по 100 часов


 
Johnmen ©   (2007-11-09 14:53) [118]


> SergeyIT   (09.11.07 14:20) [111]
> А так - месяц назад - это 9 октября 2007 года - и не важно сколько дней в месяце.
> Так и функция IncMonth в Дельфи работает.

Вы что, мой вопрос не поняли? Поясняю - почему у Вас разница дат для примера [106] одинаковая, хотя любой, знающий вычитание, человек видит, что она разная?
И во-вторых. Прошу не отвечать на непоставленные вопросы, а отвечать на поставленные. Иначе это любимая Вами демагогия получается.


 
Johnmen ©   (2007-11-09 14:56) [119]


> korneley ©

А Вас я очень прошу, пожалуйста, хватит флудить. Мало того, что не понимаете темы, ещё и другим мешаете понять.


 
korneley ©   (2007-11-09 15:03) [120]


> далее 31>30, но что мы видим??? 0.1.0 = 0.1.0 !!!
Да, но месяц-то и там и там один прошел. Так чему удивляться?


 
korneley ©   (2007-11-09 15:05) [121]


> А Вас я очень прошу, пожалуйста, хватит флудить
Пошел стену искать, засим замолкаю....


 
Anatoly Podgoretsky ©   (2007-11-09 15:18) [122]

> korneley  (09.11.2007 14:53:57)  [117]

Но это нормальный путь, когда документально оформляются бизнес правила.
Например я встречал места, где утверждено, что в месяце 30, 30.5, 31 день, в основном 30 дней в месяце и 365 или 365.25 в году
А без этого вы будете друг другу бить морды и обвинять друг друга. В большинстве места не мудрят а измеряют в днях


 
SergeyIT ©   (2007-11-09 15:26) [123]


> Johnmen ©   (09.11.07 14:53) [118]
>
> Вы что, мой вопрос не поняли? Поясняю - почему у Вас разница
> дат для примера [106] одинаковая, хотя любой, знающий вычитание,
>  человек видит, что она разная?

Разве разная? - ровно 1 месяц получается.
Вот и korneley Вам указал на это.
Засим тоже умолкаю.


 
Johnmen ©   (2007-11-09 15:34) [124]


> SergeyIT ©   (09.11.07 15:26) [123]

Дурковать многие умеют. Но у Вас это получается очень тонко - первое впечатление, что Вы тупой. Ан нет!
Засим тоже умолкаю.
И это правильно.


 
Германн ©   (2007-11-09 15:53) [125]


> Засим тоже умолкаю.
> И это правильно.
>

Нет. Правильно будет за сим.
:)


 
Джо ©   (2007-11-09 16:08) [126]

> [125] Германн ©   (09.11.07 15:53)
>
> > Засим тоже умолкаю.
> > И это правильно.
> >
>
> Нет. Правильно будет за сим.
> :)

Нет, как-раз первоначальный вариант — правильный.
Но все это оффтоп, конечно.


 
clickmaker ©   (2007-11-09 16:11) [127]


> Правильно будет за сим

Правильно будет: "Ну! За присутствующих здесь Сим!"


 
Германн ©   (2007-11-09 16:19) [128]


> Джо ©   (09.11.07 16:08) [126]

Угу. Был не прав.


 
Anatoly Podgoretsky ©   (2007-11-09 17:04) [129]

> clickmaker  (09.11.2007 16:11:07)  [127]

"Ну! За присутствующих здесь Засим!"


 
korneley ©   (2007-11-09 17:48) [130]

[126] - [129]
А ещё меня во флуде упрекали :) Но, тем не менее поддержу:" И за DIMM!"


 
engine ©   (2007-11-09 18:07) [131]

А в сутках 23, 24 или 25 часов? )))


 
Anatoly Podgoretsky ©   (2007-11-09 19:08) [132]

> korneley  (09.11.2007 17:48:10)  [130]

А ты чего хочешь то? Ветка давно уже флудерская, ее может стоит в Потрепаться кинуть. Если ветка не удаляется, то только лишь потому, что автор еще матом не ругается.


 
Andy BitOff ©   (2007-11-10 02:29) [133]


> Anatoly Podgoretsky ©   (09.11.07 19:08) [132]
>  Если ветка не удаляется, то только лишь потому,
> что автор еще матом не ругается.

Я на редкость спокойный и терпеливый, даже, не побоюсь этого слова - толерантный, меня трудно вывести из равновесия, да еще довести до такой степени, что бы я прилюдно стал ругаться матом.
Это вам, уважаемым, видно нечем заняться, всё флудите, да флудите, а некоторые (не будет тыкать в грудь пальцем) в это время работают ;)
А по поводу сабжа. Реализация возможна. Алгоритм проработан и испытан вручную, на кошках.
Спасибо SergeyIT за понимание и поддержку, он в одиночку сражался с флудерами до конца =)
Спасибо Johnmen, который честно пытался доказать, что реализация этой задачи не возможна. А спасибо именно за то, что направил на путь истинный, может быть сам этого и не осознавая. Именно из его постов было подчерпнуто зерно истины.
Ну, а остальным, за столь долгое обсуждение темы. =) Это же надо 132 поста!


> Johnmen ©   (09.11.07 13:22) [106]
> > SergeyIT ©   (09.11.07 12:57) [101]
> 1. 15.06.2007 - 15.07.2007 = 0.1.0
> 2. 15.07.2007 - 15.08.2007 = 0.1.0
> При этом
> 1. = 30 суток
> 2. = 31 сутки
> далее 31>30, но что мы видим??? 0.1.0 = 0.1.0 !!!

Всё правильно. В 6 месяце 30 дней, а в седьмом 31, в этом как раз и суть. И ответ правильный. Посчитайте пальчиком (не вычитанием) на календаре и вы увидите, что между этими датами ровно МЕСЯЦ или 30 и 31 день, соответственно. Вот где зерно истины. В предыдущем месяце.


 
Германн ©   (2007-11-10 02:37) [134]


> Andy BitOff ©   (10.11.07 02:29) [133]
>
>

"И вечный бой. Покой нам только снится!"


 
Andy BitOff ©   (2007-11-10 02:45) [135]


> Германн ©   (10.11.07 02:37) [134]

Флудеров я уже поблагодарил. Им можно больше не беспокоиться. Тем более, что ветка не в потрепаться.


 
Германн ©   (2007-11-10 03:05) [136]


> Andy BitOff ©   (10.11.07 02:45) [135]
>
>

А чем ты лучше (выше) тех, кого
> уже поблагодарил.
?
Задачу не поставил. Это раз.
Обстановку не описАл. Это два.
И требовал решения!

АП прав. Ветка была изначально флудерская.


 
Джо ©   (2007-11-10 03:08) [137]

Кстати, кто-то соберется, наконец, дать формальное описание задачи?
А то пока наблюдаются многократные попытки написать незнамо что.
Как-то оно, ИМХО, утомительно.


 
Andy BitOff ©   (2007-11-10 04:04) [138]

Дано:
Два значения типа TDate.
Первое >= второму.
В частном случае, первое значение Now()
Задача:
Получить разницу между этими датами (количество полных дней, месяцев, лет) в строковую переменную в формате dd.mm.yy
Например:
Now() - Now() = 00.00.00
Now() - (IncDay(Now()), - 1) = 01.00.00
05.11.2007 - 05.11.2006 = 00.00.01
15.07.2007 - 15.06.2007 = 00.01.00
15.08.2007 - 15.07.2007 = 00.01.00


 
Andy BitOff ©   (2007-11-10 04:14) [139]


> Германн ©   (10.11.07 03:05) [136]
> Задачу не поставил. Это раз.
> Обстановку не описАл. Это два.И требовал решения!

Задачу поставил. Согласен, что неказисто, но на то время у меня моск плавился. Но позже, несколькими постами ниже, её всё-таки выяснили.
Обстановку. Какую обстановку? Ну сидел на стуле за столом, лицом вперед. Передомной стоял ноутбук, в руках КПК - писал сюда пост. Вот и вся обстановка. А, еще народ вокруг какой-то был, но я думаю, это не столь существенно, или вам нужны их имена?


 
Virgo_Style ©   (2007-11-10 09:27) [140]

> Andy BitOff ©   (10.11.07 04:04) [138]
> (количество полных дней, месяцев, лет)


Если вдруг ты не заметил, то все обсуждение вертится вокруг вопроса "сколько дней в месяце и в году".


 
Andy BitOff ©   (2007-11-10 11:36) [141]

А я чего-то не понял...
Что нет функции, которая возвращает количество дней в месяце по году и месяцу?


 
Andy BitOff ©   (2007-11-10 11:55) [142]

Да я, собственно, как и писал выше, уже решил эту задачу. Правда в выходные я редко пишу, но алгоритм готов, если кому интересно, то могу вечером его набрасать (будет над чем пофлудить ;) ). А если кому код надо, то в понедельник.


 
Anatoly Podgoretsky ©   (2007-11-10 12:04) [143]

> Andy BitOff  (10.11.2007 11:36:21)  [141]

Ну вот опять, интервал это не точка на шкале времени. После получения интервала никакой год и месяц не существует.
Похоже что это длинное обсуждение пошло насмарку.


 
Johnmen ©   (2007-11-10 21:51) [144]


> Andy BitOff ©   (10.11.07 02:29) [133]
> Всё правильно. В 6 месяце 30 дней, а в седьмом 31, в этом как раз и суть.
> И ответ правильный. Посчитайте пальчиком (не вычитанием) на календаре
> и вы увидите, что между этими датами ровно МЕСЯЦ или 30 и 31 день,
> соответственно. Вот где зерно истины. В предыдущем месяце.

Следуя этой логике между 31.01.2007 и 02.03.2007 ровно месяц, т.е. 31 сутки, ведь это "зерно истины, предыдущий месяц". Да?
Я думаю, что ты все равно не понял сути. Почитай последние посты дяди Толи (не флудерские), подумай...


 
Anatoly Podgoretsky ©   (2007-11-10 22:28) [145]

> Johnmen  (10.11.2007 21:51:24)  [144]

Ты скоро будешь писать - дедушки Толи :-)
А по сути, очень мало кто понимает, что такое время.


 
Виталий Панасенко(дом)   (2007-11-10 23:47) [146]


> Anatoly Podgoretsky ©   (10.11.07 22:28) [145]

Время и пространство когда-то были единой сущностью..А по сути вопроса.. фигня какая-то, а не вопрос.. Между датами можно получить РАЗНИЦУ В ДНЯХ..Но то, что просит автор... Я думаю DateDiff поможет...Из JEDI.. возвращает разницу между датами в днях, месяцах, годах


 
Johnmen ©   (2007-11-11 00:00) [147]


> Anatoly Podgoretsky ©   (10.11.07 22:28) [145]
> Ты скоро будешь писать - дедушки Толи :-)

Ты станешь дедом? Серьезно?

> А по сути, очень мало кто понимает, что такое время.

Это точно. Но не понимая еще и пальцы гнут и неокрепшие души развращают... :)
Грустно...


 
Anatoly Podgoretsky ©   (2007-11-11 00:05) [148]


> Время и пространство когда-то были единой сущностью.

Но потом появились программисты.


 
Германн ©   (2007-11-11 00:15) [149]

"Time is the Simplest Thing"
Copyright © 1961 Clifford D. Simak


 
Progs   (2007-11-11 07:21) [150]

>>>Виталий Панасенко(дом)   (10.11.07 23:47) [146]
Между датами можно получить РАЗНИЦУ В ДНЯХ.

Странная конечно ситуация.
Хорошо, а почему бы автору  не разбить заранее кол-во дней по месяцам (что то типа констант некоторых, вдобавок проработав календарь :) проги же есть), а получив результат в виде разницы в количестве дней, преобразовать в тот вид который ему нужен и не ломать голову. Конечно грубовато, в одну строку код не получится.
Потому что, как посмотрю, спор уже идет по терминологии, сколько дней там, сколько здесь и т.д. и т.п.

С уважением.


 
Sergey Masloff   (2007-11-11 09:03) [151]

Ну и флуда... Там за полчаса пишется
см. http://delphimaster.net/view/15-1194730016/ пост [101]


 
ari_9   (2007-11-11 13:31) [152]

я понимаю, как глупо влезать в такую тему на третий день флуда, но тем не менее. если автору нужен ответ в ОБЩЕГУМАНИТАРНОМ смысле, что-ли, то он, очевидно, может быть дан

ведь когда говорят, мне "двадцать восемь лет, один месяц и 16 дней" этот ответ тоже никак не может быть однозначно преобразован в дни (високосные годы и разные длины месяцев). но так иногда говорят

есть первая дата year1.month1.day1 и вторая, year2.month2.day2. тогда ответом будет yearХ.monthХ.dayХ, где :

yearХ - количество ПОЛНЫХ лет между year1.month1.day1 и year2.month2.day2

monthХ - количество ПОЛНЫХ месяцев между year1+yearХ.month1.day1 и year2.month2.day2

dayХ - количество дней между year1+yearХ.month1+monthХ.day1 и year2.month2.day2


 
ari_9   (2007-11-11 13:49) [153]

да, конечно в этом случае будет интересная ситуация, например, между 2006.08.31 и 2006.10.01, потому что полный месяц разницы - один, а даты (2006+0).(8+1).31 не существует (в сентябре 30 дней). но это просто означает, что необходимо определить поведение в этом случае - либо переносить дни в следующий месяц, либо всего обрезать число даты до максимального в полученном месяце

самый интересный вопрос - можно ли добиться таким образом свойста аддитивности алгоритма. то есть сумма разниц (дата 1 -  дата 2) и (дата 2 - дата 3) будет равна (дата 1 - дата 3) для любых дат ? ... ясно, что обрезая числа месяца - нельзя. а перенося их в следующий, мне кажется - да


 
Andy BitOff ©   (2007-11-12 10:21) [154]


> Johnmen ©   (10.11.07 21:51) [144]
> Следуя этой логике между
> 31.01.2007 и 02.03.2007 ровно месяц, т.е. 31 сутки, ведь это
> "зерно истины, предыдущий месяц". Да?Я думаю, что ты все
> равно не понял сути. Почитай последние посты дяди Толи (не
> флудерские), подумай...

> "зерно истины, предыдущий месяц". Да?
Да!
Я думаю, что ты все равно не понял сути. (c)Johnmen
31.01.2007 и 02.03.2007
Мне сейчас лень считать, но про 31 сутки ты не прав, предыдущий месяц 28 суток, вот и посчитай сколько будет.

Смотри, на данном примере. Берем общее количество дней между датами (нет дельфей под рукой, сколько там будет?) примерно 1+28+2, т.е. 31 (впрочем, как ты и заметил). Теперь получаем количество дней в 01.2007, их 31. Число текущего обрабатываемого месяца 31 (31.01.2007), увеличим некую переменную отвечающую за количество дней на результат их разницы (кол.д.тек.мес. - чис.обр.дня) = 0 дней  + 1 день, чтобы текущим стал 02.2007 итого 1. Вычтем из общего числа дней эту некую переменную = 30. Поскольку январь кончился (и мы об этом знаем), то переходим к февралю. Получаем количество дней в 02.2007 = 28.
Увеличим ту некую переменную отвечающую за количество дней на результат их разницы (кол.д.тек.мес. - чис.обр.дня) = 27 дней  + 1 день, чтобы текущим стал 03.2007 итого 1 + 28. Вычтем из общего числа дней эту некую переменную = 1. НО ПОСКОЛЬКУ МЫ ТОЛЬКО ЧТО ОБРАБОТАЛИ ЦЕЛЫЙ МЕСЯЦ, то увеличим некую переменную отвечающую за количество месяцев и обнулим ту, которая дней. Получаем количество дней в 03.2007 = 31, но это явно меньше чем у нас осталось от общего количества, за сим просто возьмем остаток дней 2 и еще +1 и прибавим их к той некой переменной, которая отвечала за дни = 3. Всё. Результат 03.01.00

P.S.
Это грубое описание алгоритма. Но в ОБЩЕМ всё понятно и правильно.

P.P.S.
К тому же я уже говорил, что ЭТО КОНЕЧНЫЙ СТАТИСТИЧЕСКИЙ РЕЗУЛЬТАТ  и никакой дальнейшей обработки этой строки производиться не будет. За сим, мне по барабану, можно ли получить обратный результат и т.п.

P.P.P.S.
Этот текст я набирал сегодня в пять утра, так что возможна некоторая сумбурность. За это прошу прощения. Сейчас пришел с работы после бессонной ночи и собираюсь поспать.


 
Anatoly Podgoretsky ©   (2007-11-12 11:53) [155]

> Andy BitOff  (12.11.2007 10:21:34)  [154]

> так что возможна некоторая сумбурность.

Хм, я думал, что у слова некоторая немного другое значение, это не некоторая, а большая ее половина.


 
Johnmen ©   (2007-11-12 14:39) [156]


> Andy BitOff ©   (12.11.07 10:21) [154]

Хорошо. Я правда не понял алгоритма.
Итак имеем
31.01.2007 - 02.03.2007 = 03.01.00
уменьшаем вычитаемое на 1 сутки
31.01.2007 - 01.03.2007 = 02.01.00
уменьшаем вычитаемое на 1 сутки
31.01.2007 - 28.02.2007 = 01.01.00 так, да?
уменьшаем вычитаемое на 1 сутки
31.01.2007 - 27.02.2007 = 00.01.00 так, да?

Продолжай думать...:)


 
Andy BitOff ©   (2007-11-12 15:23) [157]


> Johnmen ©   (12.11.07 14:39) [156]

Попробуй прочитать еще раз.
Последние две строчки не правильно, потому что "зерно истины, предыдущий месяц", а там он уже январь, где 31 день.


 
Johnmen ©   (2007-11-12 15:50) [158]


> Andy BitOff ©   (12.11.07 15:23) [157]

Т.е. при заданной начальной дате в непрерывной казалось бы разнице дат возникают разрывы!!!
Не существует разницы 01.01.00! А также 00.01.00!
Как же так?


 
Andy BitOff ©   (2007-11-12 19:08) [159]

Почему не существует? Очень даже существует.
01.01.2007 - 31.01.2007 = 00.01.00 потому, что в январе 31 день, что в свою очередь, является эквивалентом месяца (для января). Так же как и 01.02.2004 - 29.02.2004 = 00.01.00 и 01.02.2005 - 28.02.2005 = 00.01.00
В то время как:
01.01.2007 - 01.02.2007 = 01.01.00
а
01.02.2005 - 29.02.2005 вообще вернет ошибку еще до начала работы алгоритма, т.к. будет проверка валидности дат.

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


 
Johnmen ©   (2007-11-12 19:38) [160]

Вопрос
31.01.2007 - ??? = 00.01.00

ЗЫ
И в [156] и далее знак "-" считать не как вычитание, а как "с .. по ...". Впрочем, я думаю, все поняли.


 
Andy BitOff ©   (2007-11-12 20:53) [161]


> Johnmen ©   (12.11.07 19:38) [160]
> Вопрос31.01.2007 - ??? = 00.01.00ЗЫИ в [156] и далее знак
> "-" считать не как вычитание, а как "с .. по ...". Впрочем,
>  я думаю, все поняли.

считать не как вычитание, а как "с .. по ... включительно"!

ЗЫ
Вопрос не имеет решения, т.к. уравнение с одним неизвестным.
Читай [154]:
P.P.S.
К тому же я уже говорил, что ЭТО КОНЕЧНЫЙ СТАТИСТИЧЕСКИЙ РЕЗУЛЬТАТ  и никакой дальнейшей обработки этой строки производиться не будет. За сим, мне по барабану, можно ли получить обратный результат и т.п.

Может быть ты мне назовешь эту дату? ;)


 
Johnmen ©   (2007-11-12 21:47) [162]


> Andy BitOff ©   (12.11.07 20:53) [161]
> За сим, мне по барабану, можно ли получить обратный результат и т.п.

Не надо получать обратный результат. Просто скажи, какая дата там должна быть.

> Может быть ты мне назовешь эту дату? ;)

Нет, конечно! Это ты придумываешь алгоритмы, а не я.

ЗЫ
А вообще, мне уже не интересно.
Ну не хочешь понять - и ладно. Алгоритм тебя устраивает - и ладно....


 
SergeyIT   (2007-11-12 21:49) [163]

> Может быть ты мне назовешь эту дату?
Не дождетесь - будет очередной вопрос. Проходили - знаем :-)
Не обращайте внимания.


 
Andy BitOff ©   (2007-11-13 01:03) [164]


> Johnmen ©   (12.11.07 21:47) [162]
> ЗЫ
> А вообще, мне уже не интересно. Ну не хочешь понять - и ладно.
> Алгоритм тебя устраивает - и ладно....

Да мне-то собстно. Интересно тебе или не интересно... Не хочешь признать, что этот алгоритм работает и выдает правильный результат для любых дат, не надо, но ты так же и не доказал обратного. Я же не срашиваю тебя, почему у нас такой календарь, почему в феврале 28 дней, а (почти) каждые 4 года - 29, почему в июле и августе по 31 дню, а в других месяцах чередуется.
Вот в том-то и дело. Из-за такого календаря.
А алгоритм работает правильно и выдает правильный результат и это легко проверяется, что уже не раз было сделано.



Страницы: 1 2 3 4 5 вся ветка

Текущий архив: 2007.12.09;
Скачать: CL | DM;

Наверх




Память: 0.95 MB
Время: 0.026 c
15-1194867744
@!!ex
2007-11-12 14:42
2007.12.09
Проект вылетает


2-1195070123
olegusis
2007-11-14 22:55
2007.12.09
ICO #2


2-1195052926
olevacho_
2007-11-14 18:08
2007.12.09
Компонент для отображения форматированого текста и графики


2-1194953089
Ega23
2007-11-13 14:24
2007.12.09
Как узнать, в какой bpl содержаться классы?


15-1194734939
Johnmen
2007-11-11 01:48
2007.12.09
А где Digitman?