StartprogrammingusingObjectPascal:HejriCalendar
헤지라력(이슬람 달력)
헤지라력은 음력을 기반으로 하며, 무슬림들이 만들었습니다. 아래 사실을 근거로 하여 그레고리안력을 음(헤지라)력으로 변환하도록 도와줄 Unit을 만들려고 합니다.
- 헤지라력의 첫날은 그레고리안력의 622년 7월 16일입니다.
- 헤지라의 1년은 354.367056일 입니다.
- 헤지라의 한 달은 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은 아래의 프로시저와 함수들이 있습니다.
- 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.
- HejriToDate : 이 함수는 헤지라 날짜를 그레고리안 TDateTime 값으로 바꿔주는데 사용합니다.
- HejriDifference : 이 프로시저는 두 헤지라 날짜의 연, 월, 일 차이를 계산하는데 사용합니다.