StartprogrammingusingObjectPascal:HejriCalendar

From 흡혈양파의 번역工房
Jump to navigation Jump to search

헤지라력(이슬람 달력)

헤지라력은 음력을 기반으로 하며, 무슬림들이 만들었습니다. 아래 사실을 근거로 하여 그레고리안력을 음(헤지라)력으로 변환하도록 도와줄 Unit을 만들려고 합니다.

  1. 헤지라력의 첫날은 그레고리안력의 622년 7월 16일입니다.
  2. 헤지라의 1년은 354.367056일 입니다.
  3. 헤지라의 한 달은 29.530588일 입니다.


헤지라력은 현재 달의 주기를 가져올 때 사용할 수 있습니다.


아래는 헤지라 Unit의 코드입니다.

{
********************************************************************************
HejriUtils:         Hejri Calnder converter, for FreePascal and Delphi
Author:              Motaz Abdel Azeem
email:                 motaz@code.sd
Home page:     http://motaz.freevar.com/
License:             LGPL
Created on:     26.Sept.2009
Last modifie:  26.Sept.2009
*******************************************************************************
}
unit HejriUtils;

{$IFDEF FPC}
{$mode objfpc}{$H+}
{$ENDIF}

interface
uses
    Classes, SysUtils;
const
    HejriMonthsEn: array [1 .. 12] of string = ('Moharram', 'Safar', 'Rabie Awal',
        'Rabie Thani', 'Jumada Awal', 'Jumada Thani', 'Rajab', 'Shaban', 'Ramadan',
        'Shawal', 'Thi-Alqaida', 'Thi-Elhajah');

    HejriMonthsAr: array [1 .. 12] of string = ('‫,'محرم' , 'صفر', 'ربيع أول‬
        '‫,'ربيع ثاني', 'جمادى الأول', 'جمادى الآخر', 'رجب', 'شعبان', 'رمضان‬
        '‫;('شوال', 'ذي القعدة','ذي الحجة‬

    HejriYearDays = 354.367056;
    HejriMonthDays = 29.530588;

    procedure DateToHejri(ADateTime: TDateTime; var Year, Month, Day: Word);
    function HejriToDate(Year, Month, Day: Word): TDateTime;

    procedure HejriDifference(Year1, Month1, Day1, Year2, Month2, Day2: Word;
        var YearD, MonthD, DayD: Word);

implementation

var
    HejriStart : TDateTime;


procedure DateToHejri(ADateTime: TDateTime; var Year, Month, Day: Word);
var
    HejriY: Double;
    Days: Double;
    HejriMonth: Double;
    RDay: Double;
begin
    HejriY:= ((Trunc(ADateTime) - HejriStart - 1) / HejriYearDays);
    Days:= Frac(HejriY);
    Year:= Trunc(HejriY) + 1;
    HejriMonth:= ((Days * HejriYearDays) / HejriMonthDays);

    Month:= Trunc(HejriMonth) + 1;
    RDay:= (Frac(HejriMonth) * HejriMonthDays) + 1;
    Day:= Trunc(RDay);
end;

function HejriToDate(Year, Month, Day: Word): TDateTime;
begin
    Result:= (Year - 1) * HejriYearDays + (HejriStart - 0) +
        (Month - 1) * HejriMonthDays + Day + 1;
end;

procedure HejriDifference(Year1, Month1, Day1, Year2, Month2, Day2: Word; var
    YearD, MonthD, DayD: Word);
var
    Days1: Double;
    Days2: Double;
    DDays: Double;
    RYear, RMonth: Double;
begin
    Days1:= Year1 * HejriYearDays + (Month1 - 1) * HejriMonthDays + Day1 - 1;
    Days2:= Year2 * HejriYearDays + (Month2 - 1) * HejriMonthDays + Day2 - 1;
    DDays:= Abs(Days2 - Days1);

    RYear:= DDays / HejriYearDays;
    RMonth:= (Frac(RYear) * HejriYearDays) / HejriMonthDays;
    DayD:= Round(Frac(RMonth) * HejriMonthDays);

    YearD:= Trunc(RYear);
    MonthD:= Trunc(RMonth);
end;

initialization

    HejriStart:= EncodeDate(622, 7, 16);

end.


HejriUtils Unit은 아래의 프로시저와 함수들이 있습니다.

  1. DateToHejri : 이 프로시저는 그레고리안 날짜를 헤지라 날짜로 바꿔주는데 사용하며, 예제는 다음과 같습니다.
    program Project1;
    
        {$mode objfpc}{$H+}
    
    
    
    uses
        {$IFDEF UNIX}{$IFDEF UseCThreads}
        cthreads,
        {$ENDIF}{$ENDIF}
        Classes , HejriUtils, SysUtils
        { you can add units after this };
    
    var
        Year, Month, Day: Word;
    begin
        DateToHejri(Now, Year, Month, Day);
        Writeln('Today in Hejri: ', Day, '-', HejriMonthsEn[Month],
            '-', Year);
        Readln;
    end.
    
  2. HejriToDate : 이 함수는 헤지라 날짜를 그레고리안 TDateTime 값으로 바꿔주는데 사용합니다.
  3. HejriDifference : 이 프로시저는 두 헤지라 날짜의 연, 월, 일 차이를 계산하는데 사용합니다.