Saturday, September 11, 2010

Algorithm for Nepali date conversion



If you are looking for code to put in your website visit http://nepalidateconve.sourceforge.net/ to download php code.





.....i don't have time to read..download NepaliDateConverterAddIn.xlsm now.









The codes







Nepali date conversion consists of two parts





A. Data of number of days that occur in each month in each year. This is the reason why all the Nepali date conversion programs have its limitations





B. Algorithm to convert the date from AD to BS or vice versa.





This is explained with the code in VBA (in Excel) below with the required steps.





1. Open MS Excel





2. Open Visual Basic editor (short cut Alt + F11)





3. Insert a class module





4. Rename the class module to Nepali_Calender in Properties window (F4)





5. Paste the code 1 given at the end of this article





6. Insert a Module (normal module not class module!) and Paste the code 2 . It consists of two functions :





a. nepaliToEnglish(y,m,d,formateCode)





b. englishToNepali(y,m,d,formateCode)





where y,m,d=year, month and day and formate code will display the desired output format
































































Formate code






Formate






0






20671/25






1






2067-Mangsir-25






2






2067-Mangsir-25-Saturday








7. Now close the editor





8. Save your file as *.xlsm (macro enabled)





9. Now you can use two functions made in step 6





10. To make these functions available to all the worksheets





a. save this sheet as add-ins *.xlam format





b. then enable it at Excel Options>Add in>Manage





c. the function will be available as user defined function under Insert functions





11. . In this code the limits are





a. AD 1944-2033





b. BS 2000-2089





c. if date is out of range then output is string "Out of range"





The readymade file is also available. Download NepaliDateConverterAddIn.xlsm now.





If you are looking for code to put in your website visit http://nepalidateconve.sourceforge.net/ to download php code.









Code1







Option Explicit





'the original sorce code of this program is found in sourceforge.net





'the code in php was translated to VBA





'this add-in is copyfree and can be distributed freely in multiple copies





'the user should be responsible for the use of this add in





'the author is not liable for any damage that may occur by using this add-in





'modification to the code is welcome. Any additional data in the code if notified over the internet will be usefull to all





'***********************************************************************************************************





'*******currently can only calculate the date between BS 2000-2089 and AD 1944-2033*************************





'***********************************************************************************************************





'Coder: Nirmal Raj Joshi





'@copyfree nirmaljoshi.com.np,2010





'joshi.amn@gmail.com





Private bs As Variant





Public nep_date As Dictionary





Public eng_date As Dictionary





Public debug_info





Sub initilizeClass()





ReDim bs(90)





bs(0) = Array(2000, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31)





bs(1) = Array(2001, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(2) = Array(2002, 31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30)





bs(3) = Array(2003, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(4) = Array(2004, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31)





bs(5) = Array(2005, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(6) = Array(2006, 31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30)





bs(7) = Array(2007, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(8) = Array(2008, 31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 29, 31)





bs(9) = Array(2009, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(10) = Array(2010, 31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30)





bs(11) = Array(2011, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(12) = Array(2012, 31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30)





bs(13) = Array(2013, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(14) = Array(2014, 31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30)





bs(15) = Array(2015, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(16) = Array(2016, 31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30)





bs(17) = Array(2017, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(18) = Array(2018, 31, 32, 31, 32, 31, 30, 30, 29, 30, 29, 30, 30)





bs(19) = Array(2019, 31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31)





bs(20) = Array(2020, 31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30)





bs(21) = Array(2021, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(22) = Array(2022, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30)





bs(23) = Array(2023, 31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31)





bs(24) = Array(2024, 31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30)





bs(25) = Array(2025, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(26) = Array(2026, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(27) = Array(2027, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31)





bs(28) = Array(2028, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(29) = Array(2029, 31, 31, 32, 31, 32, 30, 30, 29, 30, 29, 30, 30)





bs(30) = Array(2030, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(31) = Array(2031, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31)





bs(32) = Array(2032, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(33) = Array(2033, 31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30)





bs(34) = Array(2034, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(35) = Array(2035, 30, 32, 31, 32, 31, 31, 29, 30, 30, 29, 29, 31)





bs(36) = Array(2036, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(37) = Array(2037, 31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30)





bs(38) = Array(2038, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(39) = Array(2039, 31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30)





bs(40) = Array(2040, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(41) = Array(2041, 31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30)





bs(42) = Array(2042, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(43) = Array(2043, 31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30)





bs(44) = Array(2044, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(45) = Array(2045, 31, 32, 31, 32, 31, 30, 30, 29, 30, 29, 30, 30)





bs(46) = Array(2046, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(47) = Array(2047, 31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30)





bs(48) = Array(2048, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(49) = Array(2049, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30)





bs(50) = Array(2050, 31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31)





bs(51) = Array(2051, 31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30)





bs(52) = Array(2052, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(53) = Array(2053, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30)





bs(54) = Array(2054, 31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31)





bs(55) = Array(2055, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(56) = Array(2056, 31, 31, 32, 31, 32, 30, 30, 29, 30, 29, 30, 30)





bs(57) = Array(2057, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(58) = Array(2058, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31)





bs(59) = Array(2059, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(60) = Array(2060, 31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30)





bs(61) = Array(2061, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(62) = Array(2062, 30, 32, 31, 32, 31, 31, 29, 30, 29, 30, 29, 31)





bs(63) = Array(2063, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(64) = Array(2064, 31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30)





bs(65) = Array(2065, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(66) = Array(2066, 31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 29, 31)





bs(67) = Array(2067, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(68) = Array(2068, 31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30)





bs(69) = Array(2069, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(70) = Array(2070, 31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30)





bs(71) = Array(2071, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(72) = Array(2072, 31, 32, 31, 32, 31, 30, 30, 29, 30, 29, 30, 30)





bs(73) = Array(2073, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31)





bs(74) = Array(2074, 31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30)





bs(75) = Array(2075, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(76) = Array(2076, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30)





bs(77) = Array(2077, 31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31)





bs(78) = Array(2078, 31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30)





bs(79) = Array(2079, 31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30)





bs(80) = Array(2080, 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30)





bs(81) = Array(2081, 31, 31, 32, 32, 31, 30, 30, 30, 29, 30, 30, 30)





bs(82) = Array(2082, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 30, 30)





bs(83) = Array(2083, 31, 31, 32, 31, 31, 30, 30, 30, 29, 30, 30, 30)





bs(84) = Array(2084, 31, 31, 32, 31, 31, 30, 30, 30, 29, 30, 30, 30)





bs(85) = Array(2085, 31, 32, 31, 32, 30, 31, 30, 30, 29, 30, 30, 30)





bs(86) = Array(2086, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 30, 30)





bs(87) = Array(2087, 31, 31, 32, 31, 31, 31, 30, 30, 29, 30, 30, 30)





bs(88) = Array(2088, 30, 31, 32, 32, 30, 31, 30, 30, 29, 30, 30, 30)





bs(89) = Array(2089, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 30, 30)





bs(90) = Array(2090, 30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 30, 30)





Set nep_date = New Dictionary





nep_date.Add "year", 0





nep_date.Add "month", 0





nep_date.Add "date", 0





nep_date.Add "day", 0





nep_date.Add "nmonth", 0





nep_date.Add "num_day", 0





Set eng_date = New Dictionary





eng_date.Add "year", 0





eng_date.Add "month", 0





eng_date.Add "date", 0





eng_date.Add "day", 0





eng_date.Add "emonth", 0





eng_date.Add "num_day", 0





End Sub





' /**





' * Calculates wheather english year is leap year or not





' *





' * @param integer $year





' * @return boolean





' */'





Public Function is_leap_year(year) As Boolean





Dim a, returnVal





a = year





If a Mod 100 = 0 Then





If a Mod 400 = 0 Then





returnVal = True





Else





returnVal = False





End If





Else





If a Mod 4 = 0 Then





returnVal = True





Else





returnVal = False





End If





End If





is_leap_year = returnVal





End Function





Public Function get_nepali_month(m)





Dim n_month





n_month = False





Select Case m





Case 1:





n_month = "Baishak"





Case 2:





n_month = "Jestha"





Case 3:





n_month = "Ashad"





Case 4:





n_month = "Shrawn"





Case 5:





n_month = "Bhadra"





Case 6:





n_month = "Ashwin"





Case 7:





n_month = "Kartik"





Case 8:





n_month = "Mangshir"





Case 9:





n_month = "Poush"





Case 10:





n_month = "Magh"





Case 11:





n_month = "Falgun"





Case 12:





n_month = "Chaitra"





End Select





get_nepali_month = n_month





End Function





Public Function get_english_month(m)





Dim eMonth





eMonth = False





Select Case m





Case 1





eMonth = "January"





Case 2:





eMonth = "February"





Case 3:





eMonth = "March"





Case 4:





eMonth = "April"





Case 5:





eMonth = "May"





Case 6:





eMonth = "June"





Case 7:





eMonth = "July"





Case 8:





eMonth = "August"





Case 9:





eMonth = "September"





Case 10:





eMonth = "October"





Case 11:





eMonth = "November"





Case 12:





eMonth = "December"





End Select





get_english_month = eMonth





End Function





Public Function get_day_of_week(d)





Dim day





day = False





Select Case d





Case 1:





day = "Sunday"





Case 2:





day = "Monday"





Case 3:





day = "Tuesday"





Case 4:





day = "Wednesday"





Case 5:





day = "Thursday"





Case 6:





day = "Friday"





Case 7:





day = "Saturday"





End Select





get_day_of_week = day





End Function





Public Function is_range_eng(yy, mm, dd)





Dim returnVal





returnVal = True





If (yy < 1944 Or yy > 2033) Then





debug_info = "Supported only between 1944-2022"





returnVal = False





End If





If (mm < 1 Or mm > 12) Then





debug_info = "Error! value 1-12 only"





returnVal = False





End If





If (dd < 1 Or dd > 31) Then





debug_info = "Error! value 1-31 only"





returnVal = False





End If





is_range_eng = returnVal





End Function





Public Function is_range_nep(yy, mm, dd)





Dim returnVal





returnVal = True





If (yy < 2000 Or yy > 2089) Then





debug_info = "Supported only between 2000-2089"





returnVal = False





End If





If (mm < 1 Or mm > 12) Then





debug_info = "Error! value 1-12 only"





returnVal = False





End If





If (dd < 1 Or dd > 32) Then





debug_info = "Error! value 1-31 only"





returnVal = False





End If





is_range_nep = returnVal





End Function





' /**





' * currently can only calculate the date between AD 1944-2033...





' *





' * @param unknown_type $yy





' * @param unknown_type $mm





' * @param unknown_type $dd





' * @return unknown





' */





Public Sub eng_to_nep(yy, mm, dd)





If (is_range_eng(yy, mm, dd) = False) Then





debug_info = "Out of range"





Else





' // english month data.





Dim month, lmonth





month = Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)





lmonth = Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)





Dim def_eyy, def_nyy, def_nmm, def_ndd





Dim total_eDays, total_nDays, a, day





Dim m, y, i, j





Dim numDay





def_eyy = 1944 ' //spear head english date...





def_nyy = 2000: def_nmm = 9: def_ndd = 17 - 1 ' //spear head nepali date...





total_eDays = 0: total_nDays = 0: a = 0: day = 7 - 1 ' //all the initializations...





m = 0: y = 0: i = 0: j = 0





numDay = 0





'// count total no. of days in-terms of year





For i = 0 To yy - def_eyy - 1 ' //total days for month calculation...(english)





If (is_leap_year(def_eyy + i) = True) Then





For j = 0 To 12 - 1





total_eDays = total_eDays + lmonth(j)





Next j





Else





For j = 0 To 12 - 1





total_eDays = total_eDays + month(j)





Next j





End If





Next i





'// count total no. of days in-terms of month





For i = 0 To (mm - 1) - 1





If (is_leap_year(yy) = True) Then





total_eDays = total_eDays + lmonth(i)





Else





total_eDays = total_eDays + month(i)





End If





Next i





' // count total no. of days in-terms of date





total_eDays = total_eDays + dd





i = 0: j = def_nmm





total_nDays = def_ndd





m = def_nmm





y = def_nyy





'// count nepali date from array





Do While (total_eDays <> 0)





a = bs(i)(j)





total_nDays = total_nDays + 1 ' //count the days





day = day + 1 ' //count the days interms of 7 days





If (total_nDays > a) Then





m = m + 1





total_nDays = 1





j = j + 1





End If





If (day > 7) Then





day = 1





End If





If (m > 12) Then





y = y + 1





m = 1





End If





If (j > 12) Then





j = 1: i = i + 1





End If





total_eDays = total_eDays - 1





Loop





numDay = day





nep_date("year") = y





nep_date("month") = m





nep_date("date") = total_nDays





nep_date("day") = get_day_of_week(day)





nep_date("nmonth") = get_nepali_month(m)





nep_date("num_day") = numDay





End If





End Sub





'





' /**





' * currently can only calculate the date between BS 2000-2089





' *





' * @param unknown_type $yy





' * @param unknown_type $mm





' * @param unknown_type $dd





' * @return unknown





' */





Public Sub nep_to_eng(yy, mm, dd)





Dim def_eyy, def_emm, def_edd





Dim def_nyy, def_nmm, def_ndd





Dim total_eDays, total_nDays, a, day





Dim m, y, i, j





Dim k, numDay





Dim month, lmonth





def_eyy = 1943: def_emm = 4: def_edd = 14 - 1 '// init english date.





def_nyy = 2000: def_nmm = 1: def_ndd = 1 ' // equivalent nepali date.





total_eDays = 0: total_nDays = 0: a = 0: day = 4 - 1 ' // initializations...





m = 0: y = 0: i = 0





k = 0: numDay = 0





month = Array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)





lmonth = Array(0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)





If (is_range_nep(yy, mm, dd) = False) Then





debug_info = "Out of range"





Else





'// count total days in-terms of year





For i = 0 To yy - def_nyy - 1





For j = 1 To 12





total_nDays = total_nDays + bs(k)(j)





Next j





k = k + 1





Next i





'// count total days in-terms of month





For j = 1 To mm - 1





total_nDays = total_nDays + bs(k)(j)





Next j





'// count total days in-terms of dat





total_nDays = total_nDays + dd





'//calculation of equivalent english date...





total_eDays = def_edd





m = def_emm





y = def_eyy





Do While (total_nDays <> 0)





If (is_leap_year(y)) Then





a = lmonth(m)





Else





a = month(m)





End If





total_eDays = total_eDays + 1





day = day + 1





If (total_eDays > a) Then





m = m + 1





total_eDays = 1





If (m > 12) Then





y = y + 1





m = 1





End If





End If





If (day > 7) Then day = 1





total_nDays = total_nDays - 1





Loop





numDay = day





eng_date("year") = y





eng_date("month") = m





eng_date("date") = total_eDays





eng_date("day") = get_day_of_week(day)





eng_date("emonth") = get_english_month(m)





eng_date("num_day") = numDay





End If





End Sub









Code 2







Public Function nepaliToEnglish(yy, mm, dd, formate)





' this function depends on Nepali_calander class





'@copyfree nirmaljoshi.com.np,2010





'formateType default=2010/1/25





'formateType 1=2010-jan-25





'formateType 2=2010-jan-25-saturday





If IsMissing(formate) Then formateType = 0





'MsgBox formateType





Dim a As Nepali_Calender





Set a = New Nepali_Calender





Call a.initilizeClass





Call a.nep_to_eng(yy, mm, dd)





If a.debug_info = "" Then





Select Case formate





Case 1:





output = a.eng_date("year") & "-" & a.eng_date("emonth") & "-" & a.eng_date("date")





Case 2:





output = a.eng_date("year") & "-" & a.eng_date("emonth") & "-" & a.eng_date("date") & "-" & a.eng_date("day")





Case Else:





output = a.eng_date("year") & "/" & a.eng_date("month") & "/" & a.eng_date("date")





End Select





Else





output = a.debug_info





End If





nepaliToEnglish = output





End Function





Public Function englishToNepali(yy, mm, dd, formate)





' this function depends on Nepali_calander class





'@copyfree nirmaljoshi.com.np,2010





'formateType default=20671/25





'formateType 1=2067-mangsir-25





'formateType 2=2067-mangsir-25-saturday





If IsMissing(formate) Then formateType = 0





'MsgBox formateType





Dim a As Nepali_Calender





Set a = New Nepali_Calender





Call a.initilizeClass





Call a.eng_to_nep(yy, mm, dd)





If a.debug_info = "" Then





Select Case formate





Case 1:





output = a.nep_date("year") & "-" & a.nep_date("nmonth") & "-" & a.nep_date("date")





Case 2:





output = a.nep_date("year") & "-" & a.nep_date("nmonth") & "-" & a.nep_date("date") & "-" & a.nep_date("day")





Case Else:





output = a.nep_date("year") & "/" & a.nep_date("month") & "/" & a.nep_date("date")





End Select





Else





output = a.debug_info





End If





englishToNepali = output





End Function




No comments:

Post a Comment