Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ даты

Автор: compiler 20.02.2007 17:58

Существуют две даты. Необходимо учитывая высокосные года найти разницу (в днях).
Идей нет. В ЧаВо ничего не нашел.

Заранее благодарен.

Автор: 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) *

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

А чего объяснять, работает и слава богу smile.gif
Примерно так:
*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) *

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

как в анекдоте про программера, сына, и солнце...
Цитата(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.
cool.gif

Автор: volvo 24.02.2007 18:23

Вот тут есть все функции, необходимые для решения:
http://forum.pascal.net.ru/index.php?s=&showtopic=6681&view=findpost&p=49106