internal virtual int GetDatePart(DateTime time, int part) { int HijriYear = 0; int HijriMonth = 0; int HijriDay = 0; UmAlQuraCalendar.CheckTicksRange(time.Ticks); UmAlQuraCalendar.ConvertGregorianToHijri(time, ref HijriYear, ref HijriMonth, ref HijriDay); if (part == 0) { return(HijriYear); } if (part == 2) { return(HijriMonth); } if (part == 3) { return(HijriDay); } if (part == 1) { return((int)(UmAlQuraCalendar.GetAbsoluteDateUmAlQura(HijriYear, HijriMonth, HijriDay) - UmAlQuraCalendar.GetAbsoluteDateUmAlQura(HijriYear, 1, 1) + 1L)); } throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_DateTimeParsing")); }
/// <summary>返回设置为指定的日期、时间和纪元的 <see cref="T:System.DateTime" />。</summary> /// <returns>设置为当前纪元中的指定日期和时间的 <see cref="T:System.DateTime" />。</returns> /// <param name="year">年份。</param> /// <param name="month">1 到 12 之间的一个整数,用于表示月。</param> /// <param name="day">1 到 29 之间的一个整数,用于表示日。</param> /// <param name="hour">0 到 23 之间的一个整数,用于表示小时。</param> /// <param name="minute">0 到 59 之间的一个整数,用于表示分钟。</param> /// <param name="second">0 到 59 之间的一个整数,用于表示秒。</param> /// <param name="millisecond">0 到 999 之间的一个整数,用于表示毫秒。</param> /// <param name="era">纪元。指定 UmAlQuraCalendar.Eras[UmAlQuraCalendar.CurrentEra] 或 <see cref="F:System.Globalization.UmAlQuraCalendar.UmAlQuraEra" />。</param> /// <exception cref="T:System.ArgumentOutOfRangeException"> /// <paramref name="year" />、<paramref name="month" />、<paramref name="day" /> 或 <paramref name="era" /> 超出了 <see cref="T:System.Globalization.UmAlQuraCalendar" /> 类支持的范围。- 或 -<paramref name="hour" /> 小于零或大于 23。- 或 -<paramref name="minute" /> 小于零或大于 59。- 或 -<paramref name="second" /> 小于零或大于 59。- 或 -<paramref name="millisecond" /> 小于零或大于 999。</exception> public override DateTime ToDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, int era) { if (day >= 1 && day <= 29) { UmAlQuraCalendar.CheckYearMonthRange(year, month, era); } else { int daysInMonth = this.GetDaysInMonth(year, month, era); if (day < 1 || day > daysInMonth) { throw new ArgumentOutOfRangeException("day", string.Format((IFormatProvider)CultureInfo.CurrentCulture, Environment.GetResourceString("ArgumentOutOfRange_Day"), (object)daysInMonth, (object)month)); } } long absoluteDateUmAlQura = UmAlQuraCalendar.GetAbsoluteDateUmAlQura(year, month, day); if (absoluteDateUmAlQura >= 0L) { return(new DateTime(absoluteDateUmAlQura * 864000000000L + Calendar.TimeToTicks(hour, minute, second, millisecond))); } throw new ArgumentOutOfRangeException((string)null, Environment.GetResourceString("ArgumentOutOfRange_BadYearMonthDay")); }
/// <summary>计算与指定初始日期相距指定月数的日期。</summary> /// <returns>在将 <paramref name="months" /> 参数指定的月数加到 <paramref name="time" /> 参数指定的日期后所得的日期。</returns> /// <param name="time">要加上月数的日期。<see cref="T:System.Globalization.UmAlQuraCalendar" /> 类仅支持从 04/30/1900 00.00.00(公历日期)到 11/16/2077 23:59:59(公历日期)的日期。</param> /// <param name="months">要添加的正月数或负月数。</param> /// <exception cref="T:System.ArgumentException">得到的日期不在 <see cref="T:System.Globalization.UmAlQuraCalendar" /> 类支持的范围内。</exception> /// <exception cref="T:System.ArgumentOutOfRangeException"> /// <paramref name="months" /> 小于 -120,000 或大于 120,000。- 或 -<paramref name="time" /> 超出了此日历支持的范围。</exception> public override DateTime AddMonths(DateTime time, int months) { if (months < -120000 || months > 120000) { throw new ArgumentOutOfRangeException("months", string.Format((IFormatProvider)CultureInfo.CurrentCulture, Environment.GetResourceString("ArgumentOutOfRange_Range"), (object)-120000, (object)120000)); } int datePart1 = this.GetDatePart(time, 0); int datePart2 = this.GetDatePart(time, 2); int day = this.GetDatePart(time, 3); int num = datePart2 - 1 + months; int month; int year; if (num >= 0) { month = num % 12 + 1; year = datePart1 + num / 12; } else { month = 12 + (num + 1) % 12; year = datePart1 + (num - 11) / 12; } if (day > 29) { int daysInMonth = this.GetDaysInMonth(year, month); if (day > daysInMonth) { day = daysInMonth; } } UmAlQuraCalendar.CheckYearRange(year, 1); DateTime dateTime = new DateTime(UmAlQuraCalendar.GetAbsoluteDateUmAlQura(year, month, day) * 864000000000L + time.Ticks % 864000000000L); Calendar.CheckAddResult(dateTime.Ticks, this.MinSupportedDateTime, this.MaxSupportedDateTime); return(dateTime); }