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:

    CAL.HIJRI = 6
    global CAL.HIJRI
 
    struct SYSTEMTIME, wYear as word, wMonth as word, _
      wDayOfWeek as word, wDay as word, wHour as word, _
      wMinute as word, wSecond as word, wMilliseconds as word
 
    struct CALDATETIME, CalId as long, Era as long, _
      Year as long, Month as long, Day as long, DayOfWeek as long, _
      Hour as long, Minute as long, Second as long, Tick as long
 
    year = 1952 : month = 5 : day = 3
 
    call GregorianToHijri year, month, day
    print year, month, day
 
    call HijriToGregorian year, month, day
    print year, month, day
 
    wait
    end
 
sub GregorianToHijri byref year, byref month, byref day
    SYSTEMTIME.wYear.struct = year
    SYSTEMTIME.wMonth.struct = month
    SYSTEMTIME.wDay.struct = day
    calldll #kernel32, "ConvertSystemTimeToCalDateTime", _
      SYSTEMTIME as struct, CAL.HIJRI as long, _
      CALDATETIME as struct, result as long
    year = CALDATETIME.Year.struct
    month = CALDATETIME.Month.struct
    day = CALDATETIME.Day.struct
end sub
 
sub HijriToGregorian byref year, byref month, byref day
    CALDATETIME.Year.struct = year
    CALDATETIME.Month.struct = month
    CALDATETIME.Day.struct = day
    CALDATETIME.CalId.struct = CAL.HIJRI
    CALDATETIME.Era.struct = 1
    for dow = 1 to 7
      CALDATETIME.DayOfWeek.struct = dow
      calldll #kernel32, "ConvertCalDateTimeToSystemTime", _
        CALDATETIME as struct, SYSTEMTIME as struct, _
        result as long
    next
    year = SYSTEMTIME.wYear.struct
    month = SYSTEMTIME.wMonth.struct
    day = SYSTEMTIME.wDay.struct
end sub
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.