Существуют две даты. Необходимо учитывая высокосные года найти разницу (в днях). Идей нет. В ЧаВо ничего не нашел.
Заранее благодарен.
Автор: volvo 20.02.2007 18:10
Идей совсем нет? Ну, тогда попробуй найти номер дня в текущем году для каждой даты (это было в FAQ-е), и количество високосных лет между заданными годами. Дальше догадаешься?
Автор: compiler 20.02.2007 19:07
Цитата(volvo @ 20.02.2007 13:10)
Идей совсем нет?
В Фаранове написано так
Цитата
Предлагаемый алгоритм подсчета количества дней заключается в вычислении количества дней от даты рождения до конца месяца, а затем и года рождения, количества дней, от начала текущего года до текущего месяца и текущей даты, а также - в подсчете количества полных лет, разделяющих обе даты. Количество лет затем легко пересчитывается в количество дней с учетом длины года (365 дней для обычных и 366 дней для високосных лет). Это очень прямолинейный алгоритм, но, откровенно говоря, мне не пришло в голову ничего другого. Возможно, существует более изящный способ подсчета и Вы его знаете, тогда программная реализация будет другой.
Вот я и подумал может действительно есть более изящный способ...
Автор: Malice 20.02.2007 20:15
Цитата(compiler @ 20.02.2007 15:07)
Вот я и подумал может действительно есть более изящный способ...
Было уже: http://forum.pascal.net.ru/index.php?showtopic=13074&st=20
Автор: volvo 20.02.2007 20:16
Цитата
может действительно есть более изящный способ
FPC + DateUtils = более изящно... Просто в одну строку...
Автор: compiler 20.02.2007 21:32
Malice
Цитата(Malice @ 20.02.2007 15:15)
Было уже: Класс календаря.
ты имееш ввиду эту функцию
function days (y,m,d:integer):longint; begin if m<3 then begin dec (y); inc (m,12); end; days:=round(int (y*365.25)+int ((m+1)*30.601)+d-int(y/100)+int (y/400)); end;
А не могла бы ты ее обьяснить...
volvo
Цитата(volvo @ 20.02.2007 15:16)
FPC + DateUtils = более изящно... Просто в одну строку...
а по подробней... (может ссылочка есть или так расскажеш)
Автор: Malice 20.02.2007 22:02
Цитата(compiler @ 20.02.2007 17:32)
ты имееш ввиду эту функцию А не могла бы ты ее обьяснить...
А чего объяснять, работает и слава богу Примерно так: *365.25 раз в 4 года из 0.25 накопится 1-ца и получится 366.. -int(y/100) - если год делится на 100 убрали ту накопившуюся 1-цу +int (y/400) - упс, вернули обратно.. +int ((m+1)*30.601) - тоже что-то копится и округляется в нужный момент. +d - тупо прибавили дни..
Автор: compiler 20.02.2007 22:08
Цитата(Malice @ 20.02.2007 17:02)
А чего объяснять, работает и слава богу
как в анекдоте про программера, сына, и солнце...
Цитата(Malice @ 20.02.2007 17:02)
+int ((m+1)*30.601) - тоже что-то копится и округляется в нужный момент.- а что?
Автор: Malice 20.02.2007 22:11
Цитата(compiler @ 20.02.2007 18:08)
а что ?
Количество дней в месяце m вестимо..
Автор: compiler 20.02.2007 22:13
Цитата(Malice @ 20.02.2007 17:11)
Количество дней в месяце m вестимо..
как то не нравится мне всё это... да еще и округление...
Автор: Malice 20.02.2007 22:20
Цитата(compiler @ 20.02.2007 18:13)
как то не нравится мне всё это... да еще и округление...
А вам шашечки или ехать ? В принципе, не нравится - сделай как фаронов сказал. Хотя и это работает нормально, куда уж изящнее..
Автор: compiler 20.02.2007 22:26
Цитата(Malice @ 20.02.2007 17:20)
Хотя и это работает нормально, куда уж изящнее..
наверняка есть колизии ведь тут применяется округление...
Автор: volvo 21.02.2007 1:41
Цитата(compiler @ 20.02.2007 16:32)
а по подробней... (может ссылочка есть или так расскажеш)
А чего рассказывать?
uses sysutils, dateutils; begin writeln('diff = ', daysbetween(strtodate('12/02/2007'), strtodate('10/02/2007'))); end.
Изобретаем велосипед дальше?
Автор: arximed 24.02.2007 18:19
pomoqite reshit' ili nayti alqoritm zadachi na datu. dayetsa segonyashniy den' nedeli i data(toest' den,mesyats i qod).eshe dayetsa data svoyeqo dnya rojdeniya(toest' den,mesyats i qod). nayti den' nedeli svoyeqo rojdeniya.
Автор: volvo 24.02.2007 18:23
Вот тут есть все функции, необходимые для решения: http://forum.pascal.net.ru/index.php?s=&showtopic=6681&view=findpost&p=49106