Конвертировать дни Delphi в год, месяц, дни

Моя IDE — RAD Studio 10.3.

Настройка моего проекта в информации о версии: «Автоматическое создание номера сборки».

Этот номер выпуска — 9004. Rad Studio Wiki (Выпуск = количество дней с 1 января 2000 г.) Сборка моего проекта 2024.08.26.

Это код, но дата неправильная.

procedure TForm1.FormCreate(Sender: TObject);
var
  A, B, I, Y, R, M, Months, Days, o1, o2, o3: Integer;

begin
  A := 9004;
  B := 43904;

  Y := 2000;
  Days := 0;

  while Days < A do begin
    if (IsLeapYear(Y)) then begin
      Inc(Days,366);
    end Else begin
      Inc(Days,365);
    end;
    Inc(Y);
  end;
  Dec(Y);
  if (IsLeapYear(Y-1)) then
    Dec(Days,366)
  Else
    Dec(Days,365);
  R := A - Days;
  Months := 1;
  M := 0;
  while M < R do begin
    Inc(M,DaysInAMonth(Y,Months));
    Inc(Months);
  end;
  Dec(Months);
  Dec(M,DaysInAMonth(Y,Months));
  ShowMEssage(IntToStr(Y)+' - '+IntTOStr(Months)+' - '+IntToStr(R-M)); // 2024-08-24 Why ????    
end;

50
1

Ответ:

Решено

В вашем коде две ошибки:

  1. IsLeapYear(Y-1) должно быть IsLeapYear(Y), потому что вы уже уменьшили Y в строке ранее.
  2. В последней строке (R-M) указан день до ожидаемой даты, поскольку первый день месяца равен 1, а не 0. Так что (R-M+1) будет правильным термином.

Однако я предлагаю использовать правильные функции:

  var dt := IncDay(EncodeDate(2000, 1, 1), 9004);