10.11.2010, 22:31
|
Активный
|
|
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
|
|
Перевод даты в дни
Здравствуйте! Написал функции перевода даты в дни, начиная с 1 января какого-либо года
Код:
const
BeginYear = 2006;
ShiftYear = 4 - BeginYear mod 4; // сдвиг года к високосному
var
MonthDays: array [0..12] of Word =
(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
function DateToDays(const Year, Month, Day: Word): Cardinal;
var
i, Days: Cardinal;
begin
// число дней
Days := Day;
// пересчет месяцев в дни
for i := 1 to Month-1 do
Inc(Days, MonthDays[i]);
// пересчет лет в дни
Days := Days + Year*365 + ((Year+ShiftYear) div 4) - 1;
// если високосный и месяц январь или февраль
if (((Year+ShiftYear) mod 4) = 0 ) and (Month <= 2) then
Dec(Days); // убираем день
result := Days;
end;
procedure DaysToDate(const CodeDate: Cardinal; var Year, Month, Day: Word);
var
Years, i: Cardinal;
Days: Integer;
begin
Years := CodeDate div 365;
Days := CodeDate mod 365 - ((Years+ShiftYear-1) div 4);
if Days < 0 then
begin
Dec(Years);
Days := Days + 365;
if ((Years+ShiftYear) mod 4) = 0 then
Inc(Days);
end;
if (((Years + BeginYear) mod 4) = 0) and (Days >= 31+29) then
Dec(Days);
Year := Years;
for i:=1 to 12 do
if Days >= MonthDays[i] then
Dec(Days, MonthDays[i])
else
begin
Month := i;
break;
end;
Day := Days+1;
end;
Так вот, все работет отлично, но постоянное появляется ошибка определения 29.02 любого високосного года =( В чем может быть ошибка? Может быть кто-нибудь сталкивался с подобной задачей?
|