Показать сообщение отдельно
  #1  
Старый 10.11.2010, 22:31
Drozh Drozh вне форума
Активный
 
Регистрация: 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 любого високосного года =( В чем может быть ошибка? Может быть кто-нибудь сталкивался с подобной задачей?
Ответить с цитированием