7 internal struct DateMapping
9 internal int HijriMonthsLengthFlags;
13 internal DateMapping(
int MonthsLengthFlags,
int GYear,
int GMonth,
int GDay)
15 HijriMonthsLengthFlags = MonthsLengthFlags;
16 GregorianDate =
new DateTime(GYear, GMonth, GDay);
20 internal const int MinCalendarYear = 1318;
22 internal const int MaxCalendarYear = 1500;
24 private static readonly DateMapping[] HijriYearInfo = InitDateMapping();
29 internal const int DateCycle = 30;
31 internal const int DatePartYear = 0;
33 internal const int DatePartDayOfYear = 1;
35 internal const int DatePartMonth = 2;
37 internal const int DatePartDay = 3;
43 private const int DEFAULT_TWO_DIGIT_YEAR_MAX = 1451;
57 internal override int BaseCalendarID => 6;
59 internal override int ID => 23;
67 public override int[]
Eras =>
new int[1]
80 if (twoDigitYearMax == -1)
82 twoDigitYearMax =
Calendar.GetSystemTwoDigitYearSetting(ID, 1451);
84 return twoDigitYearMax;
88 if (value != 99 && (value < 1318 || value > 1500))
93 twoDigitYearMax = value;
97 private static DateMapping[] InitDateMapping()
99 short[] array =
new short[736]
838 DateMapping[] array2 =
new DateMapping[array.Length / 4];
839 for (
int i = 0; i < array2.Length; i++)
841 array2[i] =
new DateMapping(array[i * 4], array[i * 4 + 1], array[i * 4 + 2], array[i * 4 + 3]);
846 private static void ConvertHijriToGregorian(
int HijriYear,
int HijriMonth,
int HijriDay, ref
int yg, ref
int mg, ref
int dg)
848 int num = HijriDay - 1;
849 int num2 = HijriYear - 1318;
850 DateTime gregorianDate = HijriYearInfo[num2].GregorianDate;
851 int num3 = HijriYearInfo[num2].HijriMonthsLengthFlags;
852 for (
int i = 1; i < HijriMonth; i++)
854 num += 29 + (num3 & 1);
857 gregorianDate = gregorianDate.AddDays(num);
858 yg = gregorianDate.Year;
859 mg = gregorianDate.Month;
860 dg = gregorianDate.Day;
863 private static long GetAbsoluteDateUmAlQura(
int year,
int month,
int day)
868 ConvertHijriToGregorian(year, month, day, ref yg, ref mg, ref dg);
869 return GregorianCalendar.GetAbsoluteDate(yg, mg, dg);
872 internal static void CheckTicksRange(
long ticks)
874 if (ticks < minDate.Ticks || ticks > maxDate.
Ticks)
876 throw new ArgumentOutOfRangeException(
"time",
string.
Format(CultureInfo.InvariantCulture, Environment.GetResourceString(
"ArgumentOutOfRange_CalendarRange"), minDate, maxDate));
880 internal static void CheckEraRange(
int era)
882 if (era != 0 && era != 1)
884 throw new ArgumentOutOfRangeException(
"era", Environment.GetResourceString(
"ArgumentOutOfRange_InvalidEraValue"));
888 internal static void CheckYearRange(
int year,
int era)
891 if (year < 1318 || year > 1500)
893 throw new ArgumentOutOfRangeException(
"year",
string.
Format(CultureInfo.CurrentCulture, Environment.GetResourceString(
"ArgumentOutOfRange_Range"), 1318, 1500));
897 internal static void CheckYearMonthRange(
int year,
int month,
int era)
899 CheckYearRange(year, era);
900 if (month < 1 || month > 12)
902 throw new ArgumentOutOfRangeException(
"month", Environment.GetResourceString(
"ArgumentOutOfRange_Month"));
906 private static void ConvertGregorianToHijri(DateTime time, ref
int HijriYear, ref
int HijriMonth, ref
int HijriDay)
911 int num4 = (int)((time.Ticks - minDate.
Ticks) / 864000000000
L) / 355;
912 while (time.CompareTo(HijriYearInfo[++num4].GregorianDate) > 0)
915 if (time.CompareTo(HijriYearInfo[num4].GregorianDate) != 0)
919 TimeSpan timeSpan = time.Subtract(HijriYearInfo[num4].GregorianDate);
923 double num5 = timeSpan.TotalDays;
924 int num6 = HijriYearInfo[num4].HijriMonthsLengthFlags;
925 int num7 = 29 + (num6 & 1);
926 while (num5 >= (
double)num7)
928 num5 -= (double)num7;
930 num7 = 29 + (num6 & 1);
933 num3 = (HijriDay = num3 + (int)num5);
938 internal virtual int GetDatePart(DateTime time,
int part)
943 long ticks = time.Ticks;
944 CheckTicksRange(ticks);
945 ConvertGregorianToHijri(time, ref HijriYear, ref HijriMonth, ref HijriDay);
955 return (
int)(GetAbsoluteDateUmAlQura(HijriYear, HijriMonth, HijriDay) - GetAbsoluteDateUmAlQura(HijriYear, 1, 1) + 1);
957 throw new InvalidOperationException(Environment.GetResourceString(
"InvalidOperation_DateTimeParsing"));
971 if (months < -120000 || months > 120000)
975 int datePart = GetDatePart(time, 0);
976 int datePart2 = GetDatePart(time, 2);
977 int num = GetDatePart(time, 3);
978 int num2 = datePart2 - 1 + months;
981 datePart2 = num2 % 12 + 1;
982 datePart += num2 / 12;
986 datePart2 = 12 + (num2 + 1) % 12;
987 datePart += (num2 - 11) / 12;
992 if (num > daysInMonth)
997 CheckYearRange(datePart, 1);
998 DateTime result =
new DateTime(GetAbsoluteDateUmAlQura(datePart, datePart2, num) * 864000000000
L + time.
Ticks % 864000000000
L);
1023 return GetDatePart(time, 3);
1043 return GetDatePart(time, 1);
1055 CheckYearMonthRange(year, month, era);
1056 if ((HijriYearInfo[year - 1318].HijriMonthsLengthFlags & (1 << month - 1)) == 0)
1063 internal static int RealGetDaysInYear(
int year)
1066 int num2 = HijriYearInfo[year - 1318].HijriMonthsLengthFlags;
1067 for (
int i = 1; i <= 12; i++)
1069 num += 29 + (num2 & 1);
1083 CheckYearRange(year, era);
1084 return RealGetDaysInYear(year);
1094 CheckTicksRange(time.
Ticks);
1105 return GetDatePart(time, 2);
1118 CheckYearRange(year, era);
1129 return GetDatePart(time, 0);
1141 public override bool IsLeapDay(
int year,
int month,
int day,
int era)
1143 if (day >= 1 && day <= 29)
1145 CheckYearMonthRange(year, month, era);
1149 if (day < 1 || day > daysInMonth)
1165 CheckYearRange(year, era);
1178 CheckYearMonthRange(year, month, era);
1191 CheckYearRange(year, era);
1192 if (RealGetDaysInYear(year) == 355)
1215 public override DateTime ToDateTime(
int year,
int month,
int day,
int hour,
int minute,
int second,
int millisecond,
int era)
1217 if (day >= 1 && day <= 29)
1219 CheckYearMonthRange(year, month, era);
1224 if (day < 1 || day > daysInMonth)
1229 long absoluteDateUmAlQura = GetAbsoluteDateUmAlQura(year, month, day);
1230 if (absoluteDateUmAlQura >= 0)
1232 return new DateTime(absoluteDateUmAlQura * 864000000000
L +
Calendar.TimeToTicks(hour, minute, second, millisecond));
1250 return base.ToFourDigitYear(year);
1252 if (year < 1318 || year > 1500)
override int GetMonth(DateTime time)
Calculates the month in which a specified date occurs.
override bool IsLeapDay(int year, int month, int day, int era)
Determines whether the specified date is a leap day.
Represents time in divisions, such as weeks, months, and years.
override int GetEra(DateTime time)
Calculates the era in which a specified date occurs.
override bool IsLeapMonth(int year, int month, int era)
Determines whether the specified month in the specified year and era is a leap month.
The exception that is thrown when the value of an argument is outside the allowable range of values a...
Represents an instant in time, typically expressed as a date and time of day. To browse the ....
override bool IsLeapYear(int year, int era)
Determines whether the specified year in the specified era is a leap year.
override DateTime AddMonths(DateTime time, int months)
Calculates a date that is a specified number of months away from a specified initial date.
override int GetMonthsInYear(int year, int era)
Calculates the number of months in the specified year of the specified era.
A type representing a date and time value.
override int GetDaysInMonth(int year, int month, int era)
Calculates the number of days in the specified month of the specified year and era.
Provides information about, and means to manipulate, the current environment and platform....
const int UmAlQuraEra
Represents the current era. This field is constant.
override int [] Eras
Gets a list of the eras that are supported by the current T:System.Globalization.UmAlQuraCalendar.
override int GetDaysInYear(int year, int era)
Calculates the number of days in the specified year of the specified era.
Represents the Saudi Hijri (Um Al Qura) calendar.
override int GetDayOfMonth(DateTime time)
Calculates the day of the month on which a specified date occurs.
override int ToFourDigitYear(int year)
Converts the specified year to a four-digit year by using the P:System.Globalization....
Format character that affects the layout of text or the operation of text processes,...
override DateTime AddYears(DateTime time, int years)
Calculates a date that is a specified number of years away from a specified initial date.
override DateTime ToDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, int era)
Returns a T:System.DateTime that is set to the specified date, time, and era.
override CalendarAlgorithmType AlgorithmType
Gets a value indicating whether the current calendar is solar-based, lunar-based, or a combination of...
override int GetLeapMonth(int year, int era)
Calculates the leap month for a specified year and era.
static CultureInfo CurrentCulture
Gets or sets the T:System.Globalization.CultureInfo object that represents the culture used by the cu...
override int DaysInYearBeforeMinSupportedYear
Gets the number of days in the year that precedes the year that is specified by the P:System....
CalendarAlgorithmType
Specifies whether a calendar is solar-based, lunar-based, or lunisolar-based.
Specifies that the class can be serialized.
override DateTime MinSupportedDateTime
Gets the earliest date and time supported by this calendar.
override DateTime MaxSupportedDateTime
Gets the latest date and time supported by this calendar.
override DayOfWeek GetDayOfWeek(DateTime time)
Calculates the day of the week on which a specified date occurs.
override int GetDayOfYear(DateTime time)
Calculates the day of the year on which a specified date occurs.
Provides information about a specific culture (called a locale for unmanaged code development)....
override int TwoDigitYearMax
Gets or sets the last year of a 100-year range that can be represented by a 2-digit year.
DayOfWeek
Specifies the day of the week.
override int GetYear(DateTime time)
Calculates the year of a date represented by a specified T:System.DateTime.
long Ticks
Gets the number of ticks that represent the date and time of this instance.