Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
UmAlQuraCalendar.cs
Go to the documentation of this file.
2
4{
5 private struct DateMapping
6 {
8
10
11 internal DateMapping(int MonthsLengthFlags, int GYear, int GMonth, int GDay)
12 {
13 HijriMonthsLengthFlags = MonthsLengthFlags;
14 GregorianDate = new DateTime(GYear, GMonth, GDay);
15 }
16 }
17
18 private static readonly DateMapping[] s_hijriYearInfo = InitDateMapping();
19
20 public const int UmAlQuraEra = 1;
21
22 private static readonly DateTime s_minDate = new DateTime(1900, 4, 30);
23
24 private static readonly DateTime s_maxDate = new DateTime(new DateTime(2077, 11, 16, 23, 59, 59, 999).Ticks + 9999);
25
27
29
31
32 internal override CalendarId BaseCalendarID => CalendarId.HIJRI;
33
34 internal override CalendarId ID => CalendarId.UMALQURA;
35
36 protected override int DaysInYearBeforeMinSupportedYear => 355;
37
38 public override int[] Eras => new int[1] { 1 };
39
40 public override int TwoDigitYearMax
41 {
42 get
43 {
44 if (_twoDigitYearMax == -1)
45 {
47 }
48 return _twoDigitYearMax;
49 }
50 set
51 {
52 if (value != 99 && (value < 1318 || value > 1500))
53 {
54 throw new ArgumentOutOfRangeException("value", value, SR.Format(SR.ArgumentOutOfRange_Range, 1318, 1500));
55 }
58 }
59 }
60
61 private static DateMapping[] InitDateMapping()
62 {
63 short[] array = new short[736]
64 {
65 746, 1900, 4, 30, 1769, 1901, 4, 19, 3794, 1902,
66 4, 9, 3748, 1903, 3, 30, 3402, 1904, 3, 18,
67 2710, 1905, 3, 7, 1334, 1906, 2, 24, 2741, 1907,
68 2, 13, 3498, 1908, 2, 3, 2980, 1909, 1, 23,
69 2889, 1910, 1, 12, 2707, 1911, 1, 1, 1323, 1911,
70 12, 21, 2647, 1912, 12, 9, 1206, 1913, 11, 29,
71 2741, 1914, 11, 18, 1450, 1915, 11, 8, 3413, 1916,
72 10, 27, 3370, 1917, 10, 17, 2646, 1918, 10, 6,
73 1198, 1919, 9, 25, 2397, 1920, 9, 13, 748, 1921,
74 9, 3, 1749, 1922, 8, 23, 1706, 1923, 8, 13,
75 1365, 1924, 8, 1, 1195, 1925, 7, 21, 2395, 1926,
76 7, 10, 698, 1927, 6, 30, 1397, 1928, 6, 18,
77 2994, 1929, 6, 8, 1892, 1930, 5, 29, 1865, 1931,
78 5, 18, 1621, 1932, 5, 6, 683, 1933, 4, 25,
79 1371, 1934, 4, 14, 2778, 1935, 4, 4, 1748, 1936,
80 3, 24, 3785, 1937, 3, 13, 3474, 1938, 3, 3,
81 3365, 1939, 2, 20, 2637, 1940, 2, 9, 685, 1941,
82 1, 28, 1389, 1942, 1, 17, 2922, 1943, 1, 7,
83 2898, 1943, 12, 28, 2725, 1944, 12, 16, 2635, 1945,
84 12, 5, 1175, 1946, 11, 24, 2359, 1947, 11, 13,
85 694, 1948, 11, 2, 1397, 1949, 10, 22, 3434, 1950,
86 10, 12, 3410, 1951, 10, 2, 2710, 1952, 9, 20,
87 2349, 1953, 9, 9, 605, 1954, 8, 29, 1245, 1955,
88 8, 18, 2778, 1956, 8, 7, 1492, 1957, 7, 28,
89 3497, 1958, 7, 17, 3410, 1959, 7, 7, 2730, 1960,
90 6, 25, 1238, 1961, 6, 14, 2486, 1962, 6, 3,
91 884, 1963, 5, 24, 1897, 1964, 5, 12, 1874, 1965,
92 5, 2, 1701, 1966, 4, 21, 1355, 1967, 4, 10,
93 2731, 1968, 3, 29, 1370, 1969, 3, 19, 2773, 1970,
94 3, 8, 3538, 1971, 2, 26, 3492, 1972, 2, 16,
95 3401, 1973, 2, 4, 2709, 1974, 1, 24, 1325, 1975,
96 1, 13, 2653, 1976, 1, 2, 1370, 1976, 12, 22,
97 2773, 1977, 12, 11, 1706, 1978, 12, 1, 1685, 1979,
98 11, 20, 1323, 1980, 11, 8, 2647, 1981, 10, 28,
99 1198, 1982, 10, 18, 2422, 1983, 10, 7, 1388, 1984,
100 9, 26, 2901, 1985, 9, 15, 2730, 1986, 9, 5,
101 2645, 1987, 8, 25, 1197, 1988, 8, 13, 2397, 1989,
102 8, 2, 730, 1990, 7, 23, 1497, 1991, 7, 12,
103 3506, 1992, 7, 1, 2980, 1993, 6, 21, 2890, 1994,
104 6, 10, 2645, 1995, 5, 30, 693, 1996, 5, 18,
105 1397, 1997, 5, 7, 2922, 1998, 4, 27, 3026, 1999,
106 4, 17, 3012, 2000, 4, 6, 2953, 2001, 3, 26,
107 2709, 2002, 3, 15, 1325, 2003, 3, 4, 1453, 2004,
108 2, 21, 2922, 2005, 2, 10, 1748, 2006, 1, 31,
109 3529, 2007, 1, 20, 3474, 2008, 1, 10, 2726, 2008,
110 12, 29, 2390, 2009, 12, 18, 686, 2010, 12, 7,
111 1389, 2011, 11, 26, 874, 2012, 11, 15, 2901, 2013,
112 11, 4, 2730, 2014, 10, 25, 2381, 2015, 10, 14,
113 1181, 2016, 10, 2, 2397, 2017, 9, 21, 698, 2018,
114 9, 11, 1461, 2019, 8, 31, 1450, 2020, 8, 20,
115 3413, 2021, 8, 9, 2714, 2022, 7, 30, 2350, 2023,
116 7, 19, 622, 2024, 7, 7, 1373, 2025, 6, 26,
117 2778, 2026, 6, 16, 1748, 2027, 6, 6, 1701, 2028,
118 5, 25, 1355, 2029, 5, 14, 2711, 2030, 5, 3,
119 1358, 2031, 4, 23, 2734, 2032, 4, 11, 1452, 2033,
120 4, 1, 2985, 2034, 3, 21, 3474, 2035, 3, 11,
121 2853, 2036, 2, 28, 1611, 2037, 2, 16, 3243, 2038,
122 2, 5, 1370, 2039, 1, 26, 2901, 2040, 1, 15,
123 1746, 2041, 1, 4, 3749, 2041, 12, 24, 3658, 2042,
124 12, 14, 2709, 2043, 12, 3, 1325, 2044, 11, 21,
125 2733, 2045, 11, 10, 876, 2046, 10, 31, 1881, 2047,
126 10, 20, 1746, 2048, 10, 9, 1685, 2049, 9, 28,
127 1325, 2050, 9, 17, 2651, 2051, 9, 6, 1210, 2052,
128 8, 26, 2490, 2053, 8, 15, 948, 2054, 8, 5,
129 2921, 2055, 7, 25, 2898, 2056, 7, 14, 2726, 2057,
130 7, 3, 1206, 2058, 6, 22, 2413, 2059, 6, 11,
131 748, 2060, 5, 31, 1753, 2061, 5, 20, 3762, 2062,
132 5, 10, 3412, 2063, 4, 30, 3370, 2064, 4, 18,
133 2646, 2065, 4, 7, 1198, 2066, 3, 27, 2413, 2067,
134 3, 16, 3434, 2068, 3, 5, 2900, 2069, 2, 23,
135 2857, 2070, 2, 12, 2707, 2071, 2, 1, 1323, 2072,
136 1, 21, 2647, 2073, 1, 9, 1334, 2073, 12, 30,
137 2741, 2074, 12, 19, 1706, 2075, 12, 9, 3731, 2076,
138 11, 27, 0, 2077, 11, 17
139 };
140 DateMapping[] array2 = new DateMapping[array.Length / 4];
141 for (int i = 0; i < array2.Length; i++)
142 {
143 array2[i] = new DateMapping(array[i * 4], array[i * 4 + 1], array[i * 4 + 2], array[i * 4 + 3]);
144 }
145 return array2;
146 }
147
148 private static void ConvertHijriToGregorian(int HijriYear, int HijriMonth, int HijriDay, out int yg, out int mg, out int dg)
149 {
150 int num = HijriDay - 1;
151 int num2 = HijriYear - 1318;
152 DateTime gregorianDate = s_hijriYearInfo[num2].GregorianDate;
153 int num3 = s_hijriYearInfo[num2].HijriMonthsLengthFlags;
154 for (int i = 1; i < HijriMonth; i++)
155 {
156 num = num + 29 + (num3 & 1);
157 num3 >>= 1;
158 }
159 gregorianDate.AddDays(num).GetDate(out yg, out mg, out dg);
160 }
161
162 private static long GetAbsoluteDateUmAlQura(int year, int month, int day)
163 {
164 ConvertHijriToGregorian(year, month, day, out var yg, out var mg, out var dg);
165 return GregorianCalendar.GetAbsoluteDate(yg, mg, dg);
166 }
167
168 internal static void CheckTicksRange(long ticks)
169 {
170 if (ticks < s_minDate.Ticks || ticks > s_maxDate.Ticks)
171 {
173 }
174 }
175
176 internal static void CheckEraRange(int era)
177 {
178 if (era != 0 && era != 1)
179 {
181 }
182 }
183
184 internal static void CheckYearRange(int year, int era)
185 {
186 CheckEraRange(era);
187 if (year < 1318 || year > 1500)
188 {
189 throw new ArgumentOutOfRangeException("year", year, SR.Format(SR.ArgumentOutOfRange_Range, 1318, 1500));
190 }
191 }
192
193 internal static void CheckYearMonthRange(int year, int month, int era)
194 {
195 CheckYearRange(year, era);
196 if (month < 1 || month > 12)
197 {
199 }
200 }
201
202 private static void ConvertGregorianToHijri(DateTime time, out int HijriYear, out int HijriMonth, out int HijriDay)
203 {
204 int num = (int)((time.Ticks - s_minDate.Ticks) / 864000000000L) / 355;
205 while (time.CompareTo(s_hijriYearInfo[++num].GregorianDate) > 0)
206 {
207 }
208 if (time.CompareTo(s_hijriYearInfo[num].GregorianDate) != 0)
209 {
210 num--;
211 }
212 TimeSpan timeSpan = time.Subtract(s_hijriYearInfo[num].GregorianDate);
213 int num2 = num + 1318;
214 int num3 = 1;
215 int num4 = 1;
216 double num5 = timeSpan.TotalDays;
217 int num6 = s_hijriYearInfo[num].HijriMonthsLengthFlags;
218 int num7 = 29 + (num6 & 1);
219 while (num5 >= (double)num7)
220 {
221 num5 -= (double)num7;
222 num6 >>= 1;
223 num7 = 29 + (num6 & 1);
224 num3++;
225 }
226 num4 += (int)num5;
227 HijriDay = num4;
228 HijriMonth = num3;
229 HijriYear = num2;
230 }
231
232 private static int GetDatePart(DateTime time, int part)
233 {
234 long ticks = time.Ticks;
235 CheckTicksRange(ticks);
236 ConvertGregorianToHijri(time, out var HijriYear, out var HijriMonth, out var HijriDay);
237 return part switch
238 {
239 0 => HijriYear,
240 2 => HijriMonth,
241 3 => HijriDay,
242 1 => (int)(GetAbsoluteDateUmAlQura(HijriYear, HijriMonth, HijriDay) - GetAbsoluteDateUmAlQura(HijriYear, 1, 1) + 1),
244 };
245 }
246
247 public override DateTime AddMonths(DateTime time, int months)
248 {
249 if (months < -120000 || months > 120000)
250 {
251 throw new ArgumentOutOfRangeException("months", months, SR.Format(SR.ArgumentOutOfRange_Range, -120000, 120000));
252 }
253 int datePart = GetDatePart(time, 0);
254 int datePart2 = GetDatePart(time, 2);
255 int num = GetDatePart(time, 3);
256 int num2 = datePart2 - 1 + months;
257 if (num2 >= 0)
258 {
259 datePart2 = num2 % 12 + 1;
260 datePart += num2 / 12;
261 }
262 else
263 {
264 datePart2 = 12 + (num2 + 1) % 12;
265 datePart += (num2 - 11) / 12;
266 }
267 if (num > 29)
268 {
269 int daysInMonth = GetDaysInMonth(datePart, datePart2);
270 if (num > daysInMonth)
271 {
272 num = daysInMonth;
273 }
274 }
275 CheckYearRange(datePart, 1);
276 DateTime result = new DateTime(GetAbsoluteDateUmAlQura(datePart, datePart2, num) * 864000000000L + time.Ticks % 864000000000L);
278 return result;
279 }
280
281 public override DateTime AddYears(DateTime time, int years)
282 {
283 return AddMonths(time, years * 12);
284 }
285
286 public override int GetDayOfMonth(DateTime time)
287 {
288 return GetDatePart(time, 3);
289 }
290
291 public override DayOfWeek GetDayOfWeek(DateTime time)
292 {
293 return (DayOfWeek)((int)(time.Ticks / 864000000000L + 1) % 7);
294 }
295
296 public override int GetDayOfYear(DateTime time)
297 {
298 return GetDatePart(time, 1);
299 }
300
301 public override int GetDaysInMonth(int year, int month, int era)
302 {
303 CheckYearMonthRange(year, month, era);
304 if ((s_hijriYearInfo[year - 1318].HijriMonthsLengthFlags & (1 << month - 1)) == 0)
305 {
306 return 29;
307 }
308 return 30;
309 }
310
311 internal static int RealGetDaysInYear(int year)
312 {
313 int num = 0;
314 int num2 = s_hijriYearInfo[year - 1318].HijriMonthsLengthFlags;
315 for (int i = 1; i <= 12; i++)
316 {
317 num = num + 29 + (num2 & 1);
318 num2 >>= 1;
319 }
320 return num;
321 }
322
323 public override int GetDaysInYear(int year, int era)
324 {
325 CheckYearRange(year, era);
326 return RealGetDaysInYear(year);
327 }
328
329 public override int GetEra(DateTime time)
330 {
332 return 1;
333 }
334
335 public override int GetMonth(DateTime time)
336 {
337 return GetDatePart(time, 2);
338 }
339
340 public override int GetMonthsInYear(int year, int era)
341 {
342 CheckYearRange(year, era);
343 return 12;
344 }
345
346 public override int GetYear(DateTime time)
347 {
348 return GetDatePart(time, 0);
349 }
350
351 public override bool IsLeapDay(int year, int month, int day, int era)
352 {
353 if (day >= 1 && day <= 29)
354 {
355 CheckYearMonthRange(year, month, era);
356 return false;
357 }
358 int daysInMonth = GetDaysInMonth(year, month, era);
359 if (day < 1 || day > daysInMonth)
360 {
361 throw new ArgumentOutOfRangeException("day", day, SR.Format(SR.ArgumentOutOfRange_Day, daysInMonth, month));
362 }
363 return false;
364 }
365
366 public override int GetLeapMonth(int year, int era)
367 {
368 CheckYearRange(year, era);
369 return 0;
370 }
371
372 public override bool IsLeapMonth(int year, int month, int era)
373 {
374 CheckYearMonthRange(year, month, era);
375 return false;
376 }
377
378 public override bool IsLeapYear(int year, int era)
379 {
380 CheckYearRange(year, era);
381 return RealGetDaysInYear(year) == 355;
382 }
383
384 public override DateTime ToDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, int era)
385 {
386 if (day >= 1 && day <= 29)
387 {
388 CheckYearMonthRange(year, month, era);
389 }
390 else
391 {
392 int daysInMonth = GetDaysInMonth(year, month, era);
393 if (day < 1 || day > daysInMonth)
394 {
395 throw new ArgumentOutOfRangeException("day", day, SR.Format(SR.ArgumentOutOfRange_Day, daysInMonth, month));
396 }
397 }
398 long absoluteDateUmAlQura = GetAbsoluteDateUmAlQura(year, month, day);
399 if (absoluteDateUmAlQura < 0)
400 {
402 }
403 return new DateTime(absoluteDateUmAlQura * 864000000000L + Calendar.TimeToTicks(hour, minute, second, millisecond));
404 }
405
406 public override int ToFourDigitYear(int year)
407 {
408 if (year < 0)
409 {
411 }
412 if (year < 100)
413 {
414 return base.ToFourDigitYear(year);
415 }
416 if (year < 1318 || year > 1500)
417 {
418 throw new ArgumentOutOfRangeException("year", year, SR.Format(SR.ArgumentOutOfRange_Range, 1318, 1500));
419 }
420 return year;
421 }
422}
static long TimeToTicks(int hour, int minute, int second, int millisecond)
Definition Calendar.cs:365
static void CheckAddResult(long ticks, DateTime minValue, DateTime maxValue)
Definition Calendar.cs:89
static int GetSystemTwoDigitYearSetting(CalendarId CalID, int defaultYearValue)
Definition Calendar.cs:378
static CultureInfo InvariantCulture
static long GetAbsoluteDate(int year, int month, int day)
override CalendarAlgorithmType AlgorithmType
static void CheckYearRange(int year, int era)
static void CheckYearMonthRange(int year, int month, int era)
override DayOfWeek GetDayOfWeek(DateTime time)
override bool IsLeapDay(int year, int month, int day, int era)
override int GetMonth(DateTime time)
static void ConvertGregorianToHijri(DateTime time, out int HijriYear, out int HijriMonth, out int HijriDay)
static int GetDatePart(DateTime time, int part)
override bool IsLeapMonth(int year, int month, int era)
static long GetAbsoluteDateUmAlQura(int year, int month, int day)
override int GetYear(DateTime time)
override int GetMonthsInYear(int year, int era)
override int GetEra(DateTime time)
override int GetDaysInMonth(int year, int month, int era)
static void ConvertHijriToGregorian(int HijriYear, int HijriMonth, int HijriDay, out int yg, out int mg, out int dg)
override int GetDayOfMonth(DateTime time)
override int GetDayOfYear(DateTime time)
override DateTime AddMonths(DateTime time, int months)
override bool IsLeapYear(int year, int era)
override int GetLeapMonth(int year, int era)
override DateTime ToDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, int era)
override DateTime AddYears(DateTime time, int years)
static readonly DateMapping[] s_hijriYearInfo
override int GetDaysInYear(int year, int era)
static string ArgumentOutOfRange_Range
Definition SR.cs:1096
static string ArgumentOutOfRange_BadYearMonthDay
Definition SR.cs:974
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string InvalidOperation_DateTimeParsing
Definition SR.cs:1434
static string ArgumentOutOfRange_CalendarRange
Definition SR.cs:982
static string ArgumentOutOfRange_Day
Definition SR.cs:998
static string ArgumentOutOfRange_NeedNonNegNum
Definition SR.cs:32
static string ArgumentOutOfRange_InvalidEraValue
Definition SR.cs:1040
Definition SR.cs:7
static void ThrowArgumentOutOfRange_Month(int month)
DayOfWeek
Definition DayOfWeek.cs:4
TimeSpan Subtract(DateTime value)
Definition DateTime.cs:1002
void GetDate(out int year, out int month, out int day)
Definition DateTime.cs:820
int CompareTo(object? value)
Definition DateTime.cs:561
DateTime AddDays(double value)
Definition DateTime.cs:432
DateMapping(int MonthsLengthFlags, int GYear, int GMonth, int GDay)
double TotalDays
Definition TimeSpan.cs:41