Помощь - Поиск - Пользователи - Календарь
Полная версия: даты
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
compiler
Существуют две даты. Необходимо учитывая высокосные года найти разницу (в днях).
Идей нет. В ЧаВо ничего не нашел.

Заранее благодарен.
volvo
Идей совсем нет? Ну, тогда попробуй найти номер дня в текущем году для каждой даты (это было в FAQ-е), и количество високосных лет между заданными годами. Дальше догадаешься?
compiler
Цитата(volvo @ 20.02.2007 13:10) *

Идей совсем нет?

В Фаранове написано так
Цитата

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

Вот я и подумал может действительно есть более изящный способ...
Malice
Цитата(compiler @ 20.02.2007 15:07) *

Вот я и подумал может действительно есть более изящный способ...

Было уже:
Класс календаря.
volvo
Цитата
может действительно есть более изящный способ
FPC + DateUtils = более изящно... Просто в одну строку...
compiler
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
Цитата(compiler @ 20.02.2007 17:32) *

ты имееш ввиду эту функцию
А не могла бы ты ее обьяснить...

А чего объяснять, работает и слава богу smile.gif
Примерно так:
*365.25 раз в 4 года из 0.25 накопится 1-ца и получится 366..
-int(y/100) - если год делится на 100 убрали ту накопившуюся 1-цу
+int (y/400) - упс, вернули обратно..
+int ((m+1)*30.601) - тоже что-то копится и округляется в нужный момент.
+d - тупо прибавили дни..
compiler
Цитата(Malice @ 20.02.2007 17:02) *

А чего объяснять, работает и слава богу smile.gif

как в анекдоте про программера, сына, и солнце...
Цитата(Malice @ 20.02.2007 17:02) *

+int ((m+1)*30.601) - тоже что-то копится и округляется в нужный момент.- а что?

Malice
Цитата(compiler @ 20.02.2007 18:08) *

а что ?

Количество дней в месяце m вестимо..
compiler
Цитата(Malice @ 20.02.2007 17:11) *

Количество дней в месяце m вестимо..

как то не нравится мне всё это... да еще и округление...
Malice
Цитата(compiler @ 20.02.2007 18:13) *

как то не нравится мне всё это... да еще и округление...

А вам шашечки или ехать ? В принципе, не нравится - сделай как фаронов сказал. Хотя и это работает нормально, куда уж изящнее..
compiler
Цитата(Malice @ 20.02.2007 17:20) *

Хотя и это работает нормально, куда уж изящнее..

наверняка есть колизии ведь тут применяется округление...
volvo
Цитата(compiler @ 20.02.2007 16:32)
а по подробней... (может ссылочка есть или так расскажеш)

А чего рассказывать?
uses sysutils, dateutils;
begin
writeln('diff = ', daysbetween(strtodate('12/02/2007'), strtodate('10/02/2007')));
end.
Изобретаем велосипед дальше?
Bard
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.
cool.gif
volvo
Вот тут есть все функции, необходимые для решения:
Задачи связанные с календарем.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.