OBJECT Codeunit 67500 Hijri Date Management { OBJECT-PROPERTIES { Date=31/12/09; Time=12:00:00; Version List=www.nextequalzero.com; } PROPERTIES { OnRun=BEGIN END; } CODE { PROCEDURE Date2Hijri@1000000000(Date@1000000000 : Date;Format@1000000004 : 'integer') : Text[80]; VAR d@1000000001 : Integer; m@1000000002 : Integer; y@1000000003 : Integer; newDate@1000000005 : Decimal; l@1000000006 : Decimal; n@1000000007 : Decimal; j@1000000008 : Decimal; WeekDay@1000000009 : Text[9]; BEGIN d := DATE2DMY(Date, 1); m := DATE2DMY(Date, 2); y := DATE2DMY(Date, 3); IF (y > 1582) OR (y = 1582) AND (m > 10) OR (y = 1582) AND (m = 10) AND (d > 14) THEN newDate := GetIntPart((1461 * (y + 4800 + GetIntPart((m-14) / 12 ))) / 4) + GetIntPart((367 * (m-2-12 * (GetIntPart((m-14) / 12 )))) / 12) - GetIntPart((3 * (GetIntPart( (y + 4900 + GetIntPart((m-14) / 12)) / 100 ))) / 4) + d - 32075 ELSE newDate := 367 * y - GetIntPart((7 * (y + 5001 + GetIntPart((m-9) / 7))) / 4) + GetIntPart((275 * m) / 9) + d + 1729777; WeekDay := GetWeekday(newDate MOD 7); l := newDate - 1948440 + 10632; n := GetIntPart((l - 1) / 10631); l := l - 10631 * n + 354; j := (GetIntPart((10985 - l) / 5316)) * (GetIntPart((50 * l) / 17719)) + (GetIntPart(l / 5670)) * (GetIntPart((43 * l) / 15238)); l := l - (GetIntPart((30 - j) / 15)) * (GetIntPart((17719 * j) /50)) - (GetIntPart(j / 16)) * (GetIntPart((15238 * j) / 43)) + 29; m := GetIntPart((24 * l) / 709); d := l - GetIntPart((709 * m) / 24); y := 30 * n + j - 30; CASE Format OF 0 : EXIT (STRSUBSTNO ('%1/%2/%3',d,m,y)); 1 : EXIT (STRSUBSTNO ('%1 %2 %3 %4 A.H.',WeekDay,d,GetLunarMonth(m),y)); END; END; PROCEDURE GetIntPart@1000000002(Value@1000000000 : Decimal) : Decimal; BEGIN EXIT(Value DIV POWER(1000, 0)); END; PROCEDURE GetWeekday@1000000003(Day@1000000000 : Integer) : Text[30]; BEGIN CASE Day OF 0 : EXIT ('Monday'); 1 : EXIT ('Tuesday'); 2 : EXIT ('Wednesday'); 3 : EXIT ('Thursday'); 4 : EXIT ('Friday'); 5 : EXIT ('Saturday'); 6 : EXIT ('Sunday'); END; END; PROCEDURE GetLunarMonth@1000000004(Month@1000000000 : Integer) : Text[30]; BEGIN CASE Month OF 1 : EXIT ('Muharram'); 2 : EXIT ('Safar'); 3 : EXIT ('Rabi I'); 4 : EXIT ('Rabi II'); 5 : EXIT ('Jumada I'); 6 : EXIT ('Jumada II'); 7 : EXIT ('Rajab'); 8 : EXIT ('Sha''ban'); 9 : EXIT ('Ramadan'); 10 : EXIT ('Shawwal'); 11 : EXIT ('Dhu''l-Qa''dah'); 12 : EXIT ('Dhu''l-Hijja'); END; END; BEGIN { Converts a Gregorian to Hijri date Usage: HijriDate := Date2Hijri(Date,Format) Date ---- Data type: Date Use this paramter to define a reference date Format ------ Data type: Integer This tells the system what format the function should return the Hijri date as. Valid values are 0,1 Examples: MESSAGE('%1',Date2Hijri(010110D,0)); This message window would show: 15/1/1431 MESSAGE('%1',Date2Hijri(010110D,1)); This message window would show: Friday 15 Muharram 1431 A.H. website: www.nextequalzero.com twitter: twitter.com/NextEqualZero email: ian6374@googlemail.com } END. } }