Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
HijriCalendar.cs
Go to the documentation of this file.
2
4
5public class HijriCalendar : Calendar
6{
7 public static readonly int HijriEra = 1;
8
9 private static readonly int[] s_hijriMonthDays = new int[13]
10 {
11 0, 30, 59, 89, 118, 148, 177, 207, 236, 266,
12 295, 325, 355
13 };
14
15 private int _hijriAdvance = int.MinValue;
16
17 private static readonly DateTime s_calendarMinValue = new DateTime(622, 7, 18);
18
19 private static readonly DateTime s_calendarMaxValue = DateTime.MaxValue;
20
22
24
26
27 internal override CalendarId ID => CalendarId.HIJRI;
28
29 protected override int DaysInYearBeforeMinSupportedYear => 354;
30
31 public int HijriAdjustment
32 {
33 get
34 {
35 if (_hijriAdvance == int.MinValue)
36 {
38 }
39 return _hijriAdvance;
40 }
41 set
42 {
43 if (value < -2 || value > 2)
44 {
46 }
49 }
50 }
51
52 public override int[] Eras => new int[1] { HijriEra };
53
54 public override int TwoDigitYearMax
55 {
56 get
57 {
58 if (_twoDigitYearMax == -1)
59 {
61 }
62 return _twoDigitYearMax;
63 }
64 set
65 {
67 if (value < 99 || value > 9666)
68 {
70 }
72 }
73 }
74
75 private long GetAbsoluteDateHijri(int y, int m, int d)
76 {
77 return DaysUpToHijriYear(y) + s_hijriMonthDays[m - 1] + d - 1 - HijriAdjustment;
78 }
79
80 private long DaysUpToHijriYear(int HijriYear)
81 {
82 int num = (HijriYear - 1) / 30 * 30;
83 int num2 = HijriYear - num - 1;
84 long num3 = (long)num * 10631L / 30 + 227013;
85 while (num2 > 0)
86 {
87 num3 += 354 + (IsLeapYear(num2, 0) ? 1 : 0);
88 num2--;
89 }
90 return num3;
91 }
92
93 internal static void CheckTicksRange(long ticks)
94 {
95 if (ticks < s_calendarMinValue.Ticks || ticks > s_calendarMaxValue.Ticks)
96 {
98 }
99 }
100
101 internal static void CheckEraRange(int era)
102 {
103 if (era != 0 && era != HijriEra)
104 {
106 }
107 }
108
109 internal static void CheckYearRange(int year, int era)
110 {
111 CheckEraRange(era);
112 if (year < 1 || year > 9666)
113 {
115 }
116 }
117
118 internal static void CheckYearMonthRange(int year, int month, int era)
119 {
120 CheckYearRange(year, era);
121 if (year == 9666 && month > 4)
122 {
123 throw new ArgumentOutOfRangeException("month", month, SR.Format(SR.ArgumentOutOfRange_Range, 1, 4));
124 }
125 if (month < 1 || month > 12)
126 {
128 }
129 }
130
131 internal virtual int GetDatePart(long ticks, int part)
132 {
133 CheckTicksRange(ticks);
134 long num = ticks / 864000000000L + 1;
135 num += HijriAdjustment;
136 int num2 = (int)((num - 227013) * 30 / 10631) + 1;
137 long num3 = DaysUpToHijriYear(num2);
138 long num4 = GetDaysInYear(num2, 0);
139 if (num < num3)
140 {
141 num3 -= num4;
142 num2--;
143 }
144 else if (num == num3)
145 {
146 num2--;
147 num3 -= GetDaysInYear(num2, 0);
148 }
149 else if (num > num3 + num4)
150 {
151 num3 += num4;
152 num2++;
153 }
154 if (part == 0)
155 {
156 return num2;
157 }
158 int i = 1;
159 num -= num3;
160 if (part == 1)
161 {
162 return (int)num;
163 }
164 for (; i <= 12 && num > s_hijriMonthDays[i - 1]; i++)
165 {
166 }
167 i--;
168 if (part == 2)
169 {
170 return i;
171 }
172 int result = (int)(num - s_hijriMonthDays[i - 1]);
173 if (part == 3)
174 {
175 return result;
176 }
178 }
179
180 public override DateTime AddMonths(DateTime time, int months)
181 {
182 if (months < -120000 || months > 120000)
183 {
184 throw new ArgumentOutOfRangeException("months", months, SR.Format(SR.ArgumentOutOfRange_Range, -120000, 120000));
185 }
186 int datePart = GetDatePart(time.Ticks, 0);
187 int datePart2 = GetDatePart(time.Ticks, 2);
188 int num = GetDatePart(time.Ticks, 3);
189 int num2 = datePart2 - 1 + months;
190 if (num2 >= 0)
191 {
192 datePart2 = num2 % 12 + 1;
193 datePart += num2 / 12;
194 }
195 else
196 {
197 datePart2 = 12 + (num2 + 1) % 12;
198 datePart += (num2 - 11) / 12;
199 }
200 int daysInMonth = GetDaysInMonth(datePart, datePart2);
201 if (num > daysInMonth)
202 {
203 num = daysInMonth;
204 }
205 long ticks = GetAbsoluteDateHijri(datePart, datePart2, num) * 864000000000L + time.Ticks % 864000000000L;
207 return new DateTime(ticks);
208 }
209
210 public override DateTime AddYears(DateTime time, int years)
211 {
212 return AddMonths(time, years * 12);
213 }
214
215 public override int GetDayOfMonth(DateTime time)
216 {
217 return GetDatePart(time.Ticks, 3);
218 }
219
220 public override DayOfWeek GetDayOfWeek(DateTime time)
221 {
222 return (DayOfWeek)((int)(time.Ticks / 864000000000L + 1) % 7);
223 }
224
225 public override int GetDayOfYear(DateTime time)
226 {
227 return GetDatePart(time.Ticks, 1);
228 }
229
230 public override int GetDaysInMonth(int year, int month, int era)
231 {
232 CheckYearMonthRange(year, month, era);
233 if (month == 12)
234 {
235 if (!IsLeapYear(year, 0))
236 {
237 return 29;
238 }
239 return 30;
240 }
241 if (month % 2 != 1)
242 {
243 return 29;
244 }
245 return 30;
246 }
247
248 public override int GetDaysInYear(int year, int era)
249 {
250 CheckYearRange(year, era);
251 if (!IsLeapYear(year, 0))
252 {
253 return 354;
254 }
255 return 355;
256 }
257
258 public override int GetEra(DateTime time)
259 {
261 return HijriEra;
262 }
263
264 public override int GetMonth(DateTime time)
265 {
266 return GetDatePart(time.Ticks, 2);
267 }
268
269 public override int GetMonthsInYear(int year, int era)
270 {
271 CheckYearRange(year, era);
272 return 12;
273 }
274
275 public override int GetYear(DateTime time)
276 {
277 return GetDatePart(time.Ticks, 0);
278 }
279
280 public override bool IsLeapDay(int year, int month, int day, int era)
281 {
282 int daysInMonth = GetDaysInMonth(year, month, era);
283 if (day < 1 || day > daysInMonth)
284 {
285 throw new ArgumentOutOfRangeException("day", day, SR.Format(SR.ArgumentOutOfRange_Day, daysInMonth, month));
286 }
287 if (IsLeapYear(year, era) && month == 12)
288 {
289 return day == 30;
290 }
291 return false;
292 }
293
294 public override int GetLeapMonth(int year, int era)
295 {
296 CheckYearRange(year, era);
297 return 0;
298 }
299
300 public override bool IsLeapMonth(int year, int month, int era)
301 {
302 CheckYearMonthRange(year, month, era);
303 return false;
304 }
305
306 public override bool IsLeapYear(int year, int era)
307 {
308 CheckYearRange(year, era);
309 return (year * 11 + 14) % 30 < 11;
310 }
311
312 public override DateTime ToDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, int era)
313 {
314 int daysInMonth = GetDaysInMonth(year, month, era);
315 if (day < 1 || day > daysInMonth)
316 {
317 throw new ArgumentOutOfRangeException("day", day, SR.Format(SR.ArgumentOutOfRange_Day, daysInMonth, month));
318 }
319 long absoluteDateHijri = GetAbsoluteDateHijri(year, month, day);
320 if (absoluteDateHijri < 0)
321 {
323 }
324 return new DateTime(absoluteDateHijri * 864000000000L + Calendar.TimeToTicks(hour, minute, second, millisecond));
325 }
326
327 public override int ToFourDigitYear(int year)
328 {
329 if (year < 0)
330 {
332 }
333 if (year < 100)
334 {
335 return base.ToFourDigitYear(year);
336 }
337 if (year > 9666)
338 {
340 }
341 return year;
342 }
343
345 {
346 if (_hijriAdvance == int.MinValue)
347 {
349 }
350 return _hijriAdvance;
351 }
352
353 private static int GetAdvanceHijriDate()
354 {
355 using RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("Control Panel\\International");
356 if (registryKey == null)
357 {
358 return 0;
359 }
360 object value = registryKey.GetValue("AddHijriDate");
361 if (value == null)
362 {
363 return 0;
364 }
365 int result = 0;
366 string text = value.ToString();
367 if (string.Compare(text, 0, "AddHijriDate", 0, "AddHijriDate".Length, StringComparison.OrdinalIgnoreCase) == 0)
368 {
369 if (text.Length == "AddHijriDate".Length)
370 {
371 result = -1;
372 }
373 else
374 {
375 try
376 {
377 int num = int.Parse(text.AsSpan("AddHijriDate".Length), NumberStyles.Integer, CultureInfo.InvariantCulture);
378 if (num >= -2 && num <= 2)
379 {
380 result = num;
381 }
382 }
383 catch (ArgumentException)
384 {
385 }
386 catch (FormatException)
387 {
388 }
389 catch (OverflowException)
390 {
391 }
392 }
393 }
394 return result;
395 }
396}
static readonly RegistryKey CurrentUser
Definition Registry.cs:7
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
long GetAbsoluteDateHijri(int y, int m, int d)
override bool IsLeapYear(int year, int era)
override int GetEra(DateTime time)
override DateTime ToDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, int era)
virtual int GetDatePart(long ticks, int part)
override int GetDaysInMonth(int year, int month, int era)
long DaysUpToHijriYear(int HijriYear)
override bool IsLeapDay(int year, int month, int day, int era)
override int GetMonth(DateTime time)
static void CheckYearMonthRange(int year, int month, int era)
static readonly DateTime s_calendarMaxValue
override DateTime AddMonths(DateTime time, int months)
override int GetDaysInYear(int year, int era)
override int GetLeapMonth(int year, int era)
static void CheckYearRange(int year, int era)
override int GetDayOfYear(DateTime time)
static readonly int[] s_hijriMonthDays
override int GetYear(DateTime time)
override int GetDayOfMonth(DateTime time)
override CalendarAlgorithmType AlgorithmType
override bool IsLeapMonth(int year, int month, int era)
override int ToFourDigitYear(int year)
static readonly DateTime s_calendarMinValue
static void CheckTicksRange(long ticks)
override int GetMonthsInYear(int year, int era)
override DateTime AddYears(DateTime time, int years)
override DayOfWeek GetDayOfWeek(DateTime time)
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
static string ArgumentOutOfRange_Bounds_Lower_Upper
Definition SR.cs:980
Definition SR.cs:7
static void ThrowArgumentOutOfRange_Month(int month)
DayOfWeek
Definition DayOfWeek.cs:4
static readonly DateTime MaxValue
Definition DateTime.cs:37