System.Globalization.UmAlQuraCalendar.ConvertGregorianToHijri C# (CSharp) Method

ConvertGregorianToHijri() private method

private ConvertGregorianToHijri ( System.DateTime time, int &HijriYear, int &HijriMonth, int &HijriDay ) : void
time System.DateTime
HijriYear int
HijriMonth int
HijriDay int
return void
        void ConvertGregorianToHijri(DateTime time, ref int HijriYear, ref int HijriMonth, ref int HijriDay)
        {

            int index, b, DaysPerThisMonth;
            double nDays;
            TimeSpan ts;
            int yh1=0, mh1=0, dh1=0;

            BCLDebug.Assert((time.Ticks >= minDate.Ticks) && (time.Ticks <= maxDate.Ticks), "Gregorian date is out of range.");

            // Find the index where we should start our search by quessing the Hijri year that we will be in HijriYearInfo.
            // A Hijri year is 354 or 355 days.  Use 355 days so that we will search from a lower index.
            
            index = (int)((time.Ticks - minDate.Ticks) / Calendar.TicksPerDay) / 355;
            do 
            {
            } while (time.CompareTo(HijriYearInfo[++index].GregorianDate)>0); //while greater

            if (time.CompareTo(HijriYearInfo[index].GregorianDate) != 0)
            {
                index--;
            }

            ts = time.Subtract(HijriYearInfo[index].GregorianDate);
            yh1 = index + MinCalendarYear;
            
            mh1 = 1;
            dh1 = 1;
            nDays = ts.TotalDays;
            b = HijriYearInfo[index].HijriMonthsLengthFlags;
            DaysPerThisMonth = 29 + (b&1);

            while (nDays >= DaysPerThisMonth)
            {
                nDays -= DaysPerThisMonth;
                b = b >> 1;
                DaysPerThisMonth = 29 + (b&1);
                mh1++;
            }
            dh1 += (int)nDays;

            HijriDay = dh1;
            HijriMonth = mh1;
            HijriYear = yh1;
        }

Usage Example

        // Token: 0x06002ED7 RID: 11991 RVA: 0x000B3DB8 File Offset: 0x000B1FB8
        internal virtual int GetDatePart(DateTime time, int part)
        {
            int  num   = 0;
            int  num2  = 0;
            int  num3  = 0;
            long ticks = time.Ticks;

            UmAlQuraCalendar.CheckTicksRange(ticks);
            UmAlQuraCalendar.ConvertGregorianToHijri(time, ref num, ref num2, ref num3);
            if (part == 0)
            {
                return(num);
            }
            if (part == 2)
            {
                return(num2);
            }
            if (part == 3)
            {
                return(num3);
            }
            if (part == 1)
            {
                return((int)(UmAlQuraCalendar.GetAbsoluteDateUmAlQura(num, num2, num3) - UmAlQuraCalendar.GetAbsoluteDateUmAlQura(num, 1, 1) + 1L));
            }
            throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_DateTimeParsing"));
        }