System.Globalization.PersianCalendar.GetDatePart C# (CSharp) Method

GetDatePart() private method

private GetDatePart ( long ticks, int part ) : int
ticks long
part int
return int
        internal int GetDatePart(long ticks, int part) {
            int PersianYear;              // Persian year
            int PersianMonth;             // Persian month
            int PersianDay;               // Persian day
            long NumDays;                 // The calculation buffer in number of days.

            CheckTicksRange(ticks);

            //
            //  Get the absolute date.  The absolute date is the number of days from January 1st, 1 A.D.
            //  1/1/0001 is absolute date 1.
            //
            NumDays = ticks / GregorianCalendar.TicksPerDay + 1;


            //
            //  Calculate the appromixate Persian Year from this magic formula.
            //
            PersianYear = (int)(((NumDays - GregorianOffset) * DateCycle) / DaysPerCycle) + 1;

            long daysToPersianYear = DaysUpToPersianYear(PersianYear);          // The absoulte date for PersianYear
            long daysOfPersianYear = GetDaysInYear(PersianYear, CurrentEra);    // The number of days for (PersianYear+1) year.

            if (NumDays < daysToPersianYear) {
                daysToPersianYear -= daysOfPersianYear;
                PersianYear--;
            } else if (NumDays == daysToPersianYear) {
                PersianYear--;
                daysToPersianYear -= GetDaysInYear(PersianYear, CurrentEra);
            } else {
                if (NumDays > daysToPersianYear + daysOfPersianYear) {
                    daysToPersianYear += daysOfPersianYear;
                    PersianYear++;
                }
            }
            if (part == DatePartYear) {
                return (PersianYear);
            }

            //
            //  Calculate the Persian Month.
            //

            NumDays -= daysToPersianYear;

            if (part == DatePartDayOfYear) {
                return ((int)NumDays);
            }

            PersianMonth = 0;
            while ((PersianMonth < 12) && (NumDays > DaysToMonth[PersianMonth]))
            {
                PersianMonth++;
            }

            if (part == DatePartMonth) {
                return (PersianMonth);
            }

            //
            //  Calculate the Persian Day.
            //
            PersianDay = (int)(NumDays - DaysToMonth[PersianMonth-1]);

            if (part == DatePartDay) {
                return (PersianDay);
            }
            // Incorrect part value.
            throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_DateTimeParsing"));
        }