' http://www.islamicsoftware.org/hijridates/hijri.bas
'
Option Base 1
Function isleap(ByVal n As Long) As Boolean
isleap = ((n Mod 4 = 0) And (n Mod 400 <> 0))
End Function
Function isLeapH(ByVal n As Integer) As Boolean
isLeapH = (n = 3 Or n = 5 Or n = 8)
End Function
Function FindYear(ByVal n As Long)
Dim YearFinder, i As Integer
'Returns number of whole years elapsed in current cycle
YearFinder = Array(354, 708, 1063, 1417, 1772, 2126, 2480, 2835)
For i = 1 To 8
If n <= YearFinder(i) Then
FindYear = i
Exit For
End If
Next i
End Function
Function FindMonth(ByVal n As Integer, ByVal leap As Boolean)
Dim MonthFinderL, MonthFinder, i As Integer
'Returns number of whole months elapsed in current year
MonthFinderL = Array(30, 59, 89, 118, 148, 177, 207, 236, 266, 296, 325, 355)
MonthFinder = Array(29, 59, 88, 118, 147, 177, 206, 236, 265, 295, 324, 354)
'would't let me make these two public!
If leap Then
For i = 1 To 12
If n <= MonthFinderL(i) Then
FindMonth = i
Exit For
End If
Next i
Else
For i = 1 To 12
If n <= MonthFinder(i) Then
FindMonth = i
Exit For
End If
Next i
End If
End Function
Function HijriDate(dat As Long) As String
Dim Hstart As Long, Cstart As Long, DCycle As Integer, YearFinder, MonthFinderL, MonthFinder
Dim elp As Long, ncycles As Long, ndays_thiscycle As Long, hyr As Long
Dim nyear As Long, leapH As Boolean, ndays_thisyear As Long
Dim months As Integer, ndays As Integer, daysinmonths As Integer
Dim ret As String, ret_date As Date
Hstart = 1324
Cstart = CLng(#2/24/1906#) 'Corresponds to 1 Muharram 1324
DCycle = 2835
YearFinder = Array(354, 708, 1063, 1417, 1772, 2126, 2480, 2835)
MonthFinderL = Array(30, 59, 89, 118, 148, 177, 207, 236, 266, 296, 325, 355)
MonthFinder = Array(29, 59, 88, 118, 147, 177, 206, 236, 265, 295, 324, 354)
elp = dat - Cstart
ncycles = elp \ DCycle 'Number of elapsed cycles
ndays_thiscycle = elp Mod DCycle
If ndays_thiscycle = 0 Then 'Last day of the cycle
hyr = Hstart + ncycles * 8
HijriDate = "12/30/" & hyr
Exit Function
End If
nyear = FindYear(ndays_thiscycle) 'This year in current cycle
leapH = isLeapH(nyear)
If nyear = 1 Then
ndays_thisyear = ndays_thiscycle
Else
ndays_thisyear = ndays_thiscycle - YearFinder(nyear - 1)
End If
months = FindMonth(ndays_thisyear, leapH) 'This month in current year
If months = 1 Then
daysinmonths = 0 'Days in preceding months
ElseIf leapH Then
daysinmonths = MonthFinderL(months - 1)
Else
daysinmonths = MonthFinder(months - 1)
End If
ndays = ndays_thisyear - daysinmonths
hyr = Hstart + ncycles * 8 + nyear - 1
'Debug.Print dat, ncycles, ndays_thiscycle
'Debug.Print nyear, leapH
'Debug.Print ndays_thisyear, months, daysinmonths
ret = months & "/" & ndays & "/" & hyr
'arnelgp
'adjust the value if it is less
ret_date = GregDate(ret)
If ret_date < dat Then
ndays = ndays + 1
ElseIf ret_date > dat Then
ndays = ndays - 1
End If
ret = months & "/" & ndays & "/" & hyr
HijriDate = ret
End Function
Sub convert_month()
Dim a(31), last_day, s As String, y As Integer, m As Integer, d As Date, l As Integer, i As Integer
last_day = Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
s = InputBox("enter month and year in the form mm/yyyy:")
y = CInt(Right(s, 4))
m = CInt(Left(s, 2))
d = DateSerial(y, m, 1)
l = last_day(m)
For i = 1 To l
a(i) = HijriDate(d + i - 1)
Debug.Print i, a(i)
Next i
End Sub
Function GregDate(hdat As String) As Date
Dim YearFinder, MonthFinderL, MonthFinder, Cstart As Long, Hstart As Integer, DCycle As Integer
Dim i As Integer, hmonth As Integer, j As Integer, hday As Integer, hyear As Integer
Dim elapsed_years As Integer, ncycles As Integer, nyear As Integer
Dim days_thiscycle As Integer, leap As Boolean, days_thisyear As Integer
YearFinder = Array(354, 708, 1063, 1417, 1772, 2126, 2480, 2835)
MonthFinderL = Array(30, 59, 89, 118, 148, 177, 207, 236, 266, 296, 325, 355)
MonthFinder = Array(29, 59, 88, 118, 147, 177, 206, 236, 265, 295, 324, 354)
Cstart = CLng(#2/24/1906#) 'Corresponds to 1 Muharram 1324
Hstart = 1324
DCycle = 2835
'parse s to produce hmonth, hday, hyear
i = InStr(hdat, "/")
hmonth = CInt(Left(hdat, i - 1))
j = InStr(i + 1, hdat, "/")
hday = CInt(Mid(hdat, i + 1, j - i - 1))
hyear = CInt(Right(hdat, Len(hdat) - j))
elapsed_years = hyear - Hstart
ncycles = elapsed_years \ 8
nyear = elapsed_years Mod 8
If nyear = 0 Then
days_thiscycle = 0
Else
days_thiscycle = YearFinder(nyear)
End If
leap = isLeapH(nyear)
If hmonth = 1 Then
days_thisyear = hday
Else
If leap Then
days_thisyear = MonthFinderL(hmonth - 1) + hday
Else
days_thisyear = MonthFinder(hmonth - 1) + hday
End If
End If
days_thiscycle = days_thiscycle + days_thisyear
GregDate = Cstart - 1 + CLng(ncycles) * CLng(DCycle) + days_thiscycle
End Function
Private Sub test()
Dim s As String
s = HijriDate(#5/1/2022#)
Debug.Print
Debug.Print s
Debug.Print GregDate(s)
End Sub