Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 1.14 MB
Время: 0.059 c
11-1180503690
Rusya
2007-05-30 09:41
2007.12.09
Стиль контрола mdvXLGrid


3-1185952264
dimaL
2007-08-01 11:11
2007.12.09
Хранимые процедуры Interbase


8-1170349122
Vitaliy U.S.
2007-02-01 19:58
2007.12.09
Цифровой фотоаппарат


2-1194963791
Shurup
2007-11-13 17:23
2007.12.09
InputBox &amp; шрифт


2-1195112208
allucard
2007-11-15 10:36
2007.12.09
Ожидание переменной





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский