65.9K
CodeProject is changing. Read more.
Home

Shamsi Convertor

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.54/5 (16 votes)

Jan 11, 2006

2 min read

viewsIcon

112927

downloadIcon

2328

Convert Hijri Shamsi Date to Gregorian and Gregorian to Hijri Shamsi

Introduction

One of the main iranian programmers is converting Date of conputer to Hijri Shamsi Date. The Hijri date have to kind. First Hijri Shamsi that it dates is related to Sun and the second one is hijri Ghamari that related to moon. the Hijri Shamsi is one of the most exact calendars in the world and it's made by Khayyam (iranian astrologer).

but as you know computer calendar work with gregorian calendar and any other kind of calendars need to convert from gregorian. this article try to convert Gregorian date to Hijri Shamsi and Hijri Shamsi date to Gregorian.

The main must we know for this converting is the diffrence of this calndars is 621 years. but one main problem is leap years in both calendars.

In Hijri Shamsi calendar the years that the remainder of their devide to 33 be one of 1, 5, 9, 13, 17, 22, 26, 30 this numbers is leap year.

And in Gregorian we the date class of .NET can calculate for us the gregorian year.
example:

Date.IsLeapYear(2005)

this function return a bool value.

Calculating Shamsi Date

Time Line of years

The point number 1 in picture show the start date of Shamsi Year

The point number 2 show Gregorian start date

the point number 3 show finish date of Shamsi year

The point number 4 show finish date of Gregorian year

First we devision 621 years from Gregorian year.

Year = GregorianDate.Year - 621

at this point we will be some where between point number 2 and 4. If we were after number 3 it means the diffrence year is 621 years but if we were before point number 3 the diffrence of years will be 622 years.

For finding this:


If ShamsiIsLeap(Year - 1) = True And Date.IsLeapYear(GregorianDate.Year) Then
ToEid = 80 'To Eid is diffrence between point number 2 and 3
Else
ToEid = 79
End If

If the passed days of Gregorian date were fewer than ToEid it means diffrence of years is 622 Years

       If GregorianDate.DayOfYear <= ToEid Then
            Year -= 1 'Diffrence is 622 Years
            Elapsed = 286 + GregorianDate.DayOfYear
            If ShamsiIsLeap(Year) And Not Date.IsLeapYear(GregorianDate.Year) Then
                Elapsed += 1
            End If
        Else
            Elapsed = GregorianDate.DayOfYear - ToEid
        End If

Elapsed is passed days of Shamsi year. and finally we convert passed days to Shamsi Date

DayOfYearToShamsi(Elapsed)
For converting Shamsi date to Gregorian we do this:
Private Sub ToGregorian()
        Dim Y As Integer
        Y = Year + 621
        Dim DOY As Integer = DayOfYear()
        Dim ToEid As Integer
        Dim YearDays As Integer
        If ShamsiIsLeap(Year - 1) And Date.IsLeapYear(Y) Then
            ToEid = 80
            YearDays = 366
        Else
            ToEid = 79
            YearDays = 365
        End If
        Dim GDays As Integer = ToEid + DOY
        If GDays > YearDays Then
            GDays -= YearDays
            Y += 1
        End If
        DayOfYearToGregorian(GDays, Y)
End Sub