Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Преобразовать Персидскую дату в дату по Грегорианскому календарю

Delphi , Синтаксис , Дата и Время

Преобразовать Персидскую дату в дату по Грегорианскому календарю

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

function Persia_to_Ger_date(aa: ShortString; ResultKind: Byte = 0): ShortString;

   function TrueTo1(co: Boolean): Integer;
   begin
     if co then TrueTo1 := 1
      else
        TrueTo1 := 0;
   end;

    const
   Conm_mons: array[0..11] of Byte = (31,28,31,30,31,30,31,31,30,31,30,31);
   LeapYearSh: array[0..4] of Integer = (1375,1379,1383,1387,1391);
   LeapYearMi: array[0..4] of Integer = (1996,2000,2004,2008,2012);
   monthes: array[0..11] of ShortString = ('Jan', 'Feb', 'Mar', 'Apr',
     'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
 type
   date = record
     da_day, da_mon, da_year: Integer;
   end;
 var
   m_mons: array[0..11] of BYTE;
   LastDayCountSh, LastDayCountMi: integer;
   a, b: date;
   sYY, sMM, sDD: ShortString;
   I: Integer;
 begin
   for I := Low(Conm_mons) to High(Conm_mons) do
     m_mons[I] := Conm_mons[I];

   a.da_day  := StrToNum(Copy(aa, DayPosInDate, DayLen));
   a.da_mon  := StrToNum(Copy(aa, MonthPosInDate, MonthLen));
   a.da_year := StrToNum(Copy(aa, YearPosInDate, YearLen));
   b.da_year := a.da_year + 621;
   Inc(b.da_year, TrueTo1(((a.da_mon > 10) or ((a.da_mon = 10) and (a.da_day >= 12)))
     or ((LeapYearSh[(a.da_year - 1374) div 4] <> a.da_year) and
     ((a.da_mon = 10) and (a.da_day = 11)))));
   Inc(m_mons[1], TrueTo1(LeapYearMi[(b.da_year - 1996) div 4] = b.da_year));
   if (a.da_mon <= 7) then LastDayCountSh := ((a.da_mon - 1) * 31 + a.da_day)
   else
      LastDayCountSh := (186 + (a.da_mon - 7) * 30 + a.da_day);
   if (b.da_year = (a.da_year + 622)) then LastDayCountMi :=
       LastDayCountSh - 286 - TrueTo1(LeapYearSh[(a.da_year - 1375) div 4] = a.da_year)
   else
      LastDayCountMi := (LastDayCountSh + 79);

   b.da_day := LastDayCountMi;
   b.da_mon := 0;
   while (LastDayCountMi > m_mons[b.da_mon]) do
   begin
     Dec(LastDayCountMi, m_mons[b.da_mon]);
     Inc(b.da_mon);
     b.da_day := LastDayCountMi;
   end;
   Inc(b.da_mon);
   if b.da_year < 1000 then sYY := sYY + '0';
   if b.da_year < 100 then sYY := sYY + '0';
   if b.da_year < 10 then sYY := sYY + '0';
   sYY := sYY + IntToStr(b.da_year);

   if b.da_mon < 10 then sMM := sMM + '0';
   sMM := sMM + IntToStr(b.da_mon);

   if b.da_day < 10 then sDD := sDD + '0';
   sDD := sDD + IntToStr(b.da_day);

   case ResultKind of
     0: Persia_to_Ger_date := sYY + '/' + sMM + '/' + sDD;
     1: Persia_to_Ger_date := sYY + ' ' + monthes[b.da_mon - 1] + ' ' + sDD;
   end;
 end;

Here's the translation of the Delphi code into Russian:

Функциональное определение

function Persia_to_Ger_date(aa: ShortString; ResultKind: Byte = 0): ShortString;

Функция принимает два параметра: aa (строка, представляющая персидскую дату) и ResultKind (опциональный параметр, определяющий формат возвращаемой даты).

Внутренние функции и переменные

function TrueTo1(co: Boolean): Integer;
const
  Conm_mons: array[0..11] of Byte = ...; // длина месяцев в годах без високосных лет
  LeapYearSh: array[0..4] of Integer = ...; // персидские високосные годы (коротко)
  LeapYearMi: array[0..4] of Integer = ...; // григорианские високосные годы (средне)
  monthes: array[0..11] of ShortString = ...; // имена месяцев на английском языке
type
  date = record
    da_day, da_mon, da_year: Integer;
  end;
var
  m_mons: array[0..11] of Byte; // длина месяцев (инициализировано позднее)
  LastDayCountSh, LastDayCountMi: integer; // количество дней для персидской и григорианской календарей
  a, b: date; // записи даты
  sYY, sMM, sDD: ShortString; // строковые представления года, месяца и дня
  I: Integer;

Функция определяет несколько внутренних функций и переменных:

  • TrueTo1: простая функция, конвертирующая булевое значение в целочисленное (0 или 1).
  • Conm_mons, LeapYearSh и LeapYearMi - массивы байтов и целочисленных значений соответственно, содержащие информацию о длине месяцев и високосных годах в обеих календарях.
  • monthes - массив строковых значений, содержащий имена месяцев на английском языке.
  • date - тип записи даты с тремя целочисленными полями: день, месяц и год.
  • m_mons, LastDayCountSh и LastDayCountMi - переменные, используемые для расчета количества дней в обеих календарях.
  • a и b - записи даты, используемые для хранения входной и выходной дат соответственно.
  • sYY, sMM и sDD - строковые переменные, используемые для строительства строки вывода даты.
  • I - целочисленная переменная, используемая как счетчик цикла.

Логика основной функции

begin
  // Инициализация массива длины месяцев
  for I := Low(Conm_mons) to High(Conm_mons) do
    m_mons[I] := Conm_mons[I];

  // Парсинг входной строки даты в записи переменных
  a.da_day := StrToNum(Copy(aa, DayPosInDate, DayLen));
  a.da_mon := StrToNum(Copy(aa, MonthPosInDate, MonthLen));
  a.da_year := StrToNum(Copy(aa, YearPosInDate, YearLen));

  // Коррекция года для персидской календари
  b.da_year := a.da_year + 621;
  Inc(b.da_year, TrueTo1(((a.da_mon > 10) or ((a.da_mon = 10) and (a.da_day >= 12)))
    or ((LeapYearSh[(a.da_year - 1374) div 4] <> a.da_year) and
      ((a.da_mon = 10) and (a.da_day = 11))))));

  // Коррекция месяца для персидской календари
  Inc(m_mons[1], TrueTo1(LeapYearMi[(b.da_year - 1996) div 4] = b.da_year));

  // Расчет количества дней для персидской календари
  if (a.da_mon <= 7) then LastDayCountSh := ((a.da_mon - 1) * 31 + a.da_day)
  else
    LastDayCountSh := (186 + (a.da_mon - 7) * 30 + a.da_day);

  // Расчет количества дней для григорианской календари (если необходимо)
  if (b.da_year = (a.da_year + 622)) then LastDayCountMi :=
     LastDayCountSh - 286 - TrueTo1(LeapYearSh[(a.da_year - 1375) div 4] = a.da_year)
  else
    LastDayCountMi := (LastDayCountSh + 79);

  // Коррекция дня для григорианской календари
  b.da_day := LastDayCountMi;
  b.da_mon := 0;
  while (LastDayCountMi > m_mons[b.da_mon]) do
  begin
    Dec(LastDayCountMi, m_mons[b.da_mon]);
    Inc(b.da_mon);
    b.da_day := LastDayCountMi;
  end;
  Inc(b.da_mon);

  // Строительство строки вывода даты
  if b.da_year < 1000 then sYY := sYY + '0';
  if b.da_year < 100 then sYY := sYY + '0';
  if b.da_year < 10 then sYY := sYY + '0';
  sYY := sYY + IntToStr(b.da_year);

  if b.da_mon < 10 then sMM := sMM + '0';
  sMM := sMM + IntToStr(b.da_mon);

  if b.da_day < 10 then sDD := sDD + '0';
  sDD := sDD + IntToStr(b.da_day);

  case ResultKind of
    0: Persia_to_Ger_date := sYY + '/' + sMM + '/' + sDD;
    1: Persia_to_Ger_date := sYY + ' ' + monthes[b.da_mon - 1] + ' ' + sDD;
  end;
end;

Логика основной функции следующая:

  1. Инициализация массива длины месяцев.
  2. Парсинг входной строки даты в записи переменных с помощью StrToNum и Copy.
  3. Коррекция года для персидской календари, добавление 621 и возможное увеличение на основе високосных лет.
  4. Коррекция месяца для персидской календари, учитывая високосные годы.
  5. Расчет количества дней для персидской календари на основе месяца и дня.
  6. Если необходимо, расчет количества дней для григорианской календари и коррекция дня.
  7. Строительство строки вывода даты с использованием корректированных года, месяца и дня.

Функция возвращает строку, представляющую конвертированную дату в одном из двух форматов: YYYY/MM/DD (по умолчанию) или YYYY MMM DD (если ResultKind равен 1).

Преобразует Персидскую дату в дату по Грегорианскому календарю с помощью алгоритма, использующего различные константы и функции для определения високосных лет и дней месяца.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Дата и Время ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 14:38:09/0.0065701007843018/1