by Richard Russell, August 2015
The code below shows how to convert between Western (Gregorian) and Islamic (Hijri) dates; it requires Windows Vista or later:
year% = 2015 : month% = 8 : day% = 14
PROC_GregorianToHijri(year%, month%, day%)
PRINT year%, month%, day%
PROC_HijriToGregorian(year%, month%, day%)
PRINT year%, month%, day%
END
DEF PROC_GregorianToHijri(RETURN year%, RETURN month%, RETURN day%)
LOCAL cdt{}, st{} : CAL_HIJRI = 6
DIM st{wYear{l&,h&}, wMonth{l&,h&}, wDayOfWeek{l&,h&}, wDay{l&,h&}, \
\ wHour{l&,h&}, wMinute{l&,h&}, wSecond{l&,h&}, wMilliseconds{l&,h&}}
DIM cdt{CalId%, Era%, Year%, Month%, Day%, DayOfWeek%, Hour%, Minute%, \
\ Second%, Tick%}
st.wYear.l& = year% : st.wYear.h& = year% >> 8
st.wMonth.l& = month% : st.wDay.l& = day%
SYS "ConvertSystemTimeToCalDateTime", st{}, CAL_HIJRI, cdt{}
year% = cdt.Year% : month% = cdt.Month% : day% = cdt.Day%
ENDPROC
DEF PROC_HijriToGregorian(RETURN year%, RETURN month%, RETURN day%)
LOCAL cdt{}, st{} : CAL_HIJRI = 6
DIM st{wYear{l&,h&}, wMonth{l&,h&}, wDayOfWeek{l&,h&}, wDay{l&,h&}, \
\ wHour{l&,h&}, wMinute{l&,h&}, wSecond{l&,h&}, wMilliseconds{l&,h&}}
DIM cdt{CalId%, Era%, Year%, Month%, Day%, DayOfWeek%, Hour%, Minute%, \
\ Second%, Tick%}
cdt.Year% = year% : cdt.Month% = month% : cdt.Day% = day%
cdt.CalId% = CAL_HIJRI : cdt.Era% = 1
FOR cdt.DayOfWeek% = 1 TO 7
SYS "ConvertCalDateTimeToSystemTime", cdt{}, st{}
NEXT
year% = st.wYear.l& + 256*st.wYear.h&
month% = st.wMonth.l& : day% = st.wDay.l&
ENDPROC
Note that, depending on the time of day and the location, there may be some ambiguity in the conversion so don't be surprised if these routines give a result which is a day or so different from that obtained from other calculators.