Форум: "Начинающим";
Текущий архив: 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 — MonthOf(FirstDate) + MonthOf(SecondDate)
end
else
CountMonth := MonthOf(SecondDate) — MonthOf(FirstDate);
if DayOf(SecondDate) < DayOf(FirstDate) then
begin
dec(CountMonth);
CountDays := DaysInMonth(FirstDate) — DayOf(FirstDate) + DayOf(SecondDate);
end else
CountDays := DayOf(SecondDate) — 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