Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
GregorianCalendarHelper.cs
Go to the documentation of this file.
2
3internal sealed class GregorianCalendarHelper
4{
5 internal static readonly int[] DaysToMonth365 = new int[13]
6 {
7 0, 31, 59, 90, 120, 151, 181, 212, 243, 273,
8 304, 334, 365
9 };
10
11 internal static readonly int[] DaysToMonth366 = new int[13]
12 {
13 0, 31, 60, 91, 121, 152, 182, 213, 244, 274,
14 305, 335, 366
15 };
16
17 internal int m_maxYear;
18
19 internal int m_minYear;
20
21 internal Calendar m_Cal;
22
23 internal EraInfo[] m_EraInfo;
24
25 internal int[] m_eras;
26
27 internal int MaxYear => m_maxYear;
28
29 public int[] Eras
30 {
31 get
32 {
33 if (m_eras == null)
34 {
35 m_eras = new int[m_EraInfo.Length];
36 for (int i = 0; i < m_EraInfo.Length; i++)
37 {
38 m_eras[i] = m_EraInfo[i].era;
39 }
40 }
41 return (int[])m_eras.Clone();
42 }
43 }
44
45 internal GregorianCalendarHelper(Calendar cal, EraInfo[] eraInfo)
46 {
47 m_Cal = cal;
48 m_EraInfo = eraInfo;
51 }
52
53 private int GetYearOffset(int year, int era, bool throwOnError)
54 {
55 if (year < 0)
56 {
57 if (throwOnError)
58 {
60 }
61 return -1;
62 }
63 if (era == 0)
64 {
66 }
67 for (int i = 0; i < m_EraInfo.Length; i++)
68 {
69 if (era != m_EraInfo[i].era)
70 {
71 continue;
72 }
73 if (year >= m_EraInfo[i].minEraYear)
74 {
75 if (year <= m_EraInfo[i].maxEraYear)
76 {
77 return m_EraInfo[i].yearOffset;
78 }
80 {
81 int num = year - m_EraInfo[i].maxEraYear;
82 for (int num2 = i - 1; num2 >= 0; num2--)
83 {
84 if (num <= m_EraInfo[num2].maxEraYear)
85 {
86 return m_EraInfo[i].yearOffset;
87 }
88 num -= m_EraInfo[num2].maxEraYear;
89 }
90 }
91 }
92 if (!throwOnError)
93 {
94 break;
95 }
97 }
98 if (throwOnError)
99 {
101 }
102 return -1;
103 }
104
105 internal int GetGregorianYear(int year, int era)
106 {
107 return GetYearOffset(year, era, throwOnError: true) + year;
108 }
109
110 internal bool IsValidYear(int year, int era)
111 {
112 return GetYearOffset(year, era, throwOnError: false) >= 0;
113 }
114
115 internal int GetDatePart(long ticks, int part)
116 {
117 CheckTicksRange(ticks);
118 int num = (int)(ticks / 864000000000L);
119 int num2 = num / 146097;
120 num -= num2 * 146097;
121 int num3 = num / 36524;
122 if (num3 == 4)
123 {
124 num3 = 3;
125 }
126 num -= num3 * 36524;
127 int num4 = num / 1461;
128 num -= num4 * 1461;
129 int num5 = num / 365;
130 if (num5 == 4)
131 {
132 num5 = 3;
133 }
134 if (part == 0)
135 {
136 return num2 * 400 + num3 * 100 + num4 * 4 + num5 + 1;
137 }
138 num -= num5 * 365;
139 if (part == 1)
140 {
141 return num + 1;
142 }
143 int[] array = ((num5 == 3 && (num4 != 24 || num3 == 3)) ? DaysToMonth366 : DaysToMonth365);
144 int i;
145 for (i = (num >> 5) + 1; num >= array[i]; i++)
146 {
147 }
148 if (part == 2)
149 {
150 return i;
151 }
152 return num - array[i - 1] + 1;
153 }
154
155 internal static long GetAbsoluteDate(int year, int month, int day)
156 {
157 if (year >= 1 && year <= 9999 && month >= 1 && month <= 12)
158 {
159 int[] array = ((year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) ? DaysToMonth366 : DaysToMonth365);
160 if (day >= 1 && day <= array[month] - array[month - 1])
161 {
162 int num = year - 1;
163 int num2 = num * 365 + num / 4 - num / 100 + num / 400 + array[month - 1] + day - 1;
164 return num2;
165 }
166 }
168 }
169
170 internal static long DateToTicks(int year, int month, int day)
171 {
172 return GetAbsoluteDate(year, month, day) * 864000000000L;
173 }
174
175 internal static long TimeToTicks(int hour, int minute, int second, int millisecond)
176 {
177 if (hour >= 0 && hour < 24 && minute >= 0 && minute < 60 && second >= 0 && second < 60)
178 {
179 if (millisecond < 0 || millisecond >= 1000)
180 {
181 throw new ArgumentOutOfRangeException("millisecond", SR.Format(SR.ArgumentOutOfRange_Range, 0, 999));
182 }
183 return InternalGlobalizationHelper.TimeToTicks(hour, minute, second) + (long)millisecond * 10000L;
184 }
186 }
187
188 internal void CheckTicksRange(long ticks)
189 {
190 if (ticks < m_Cal.MinSupportedDateTime.Ticks || ticks > m_Cal.MaxSupportedDateTime.Ticks)
191 {
193 }
194 }
195
196 public DateTime AddMonths(DateTime time, int months)
197 {
198 if (months < -120000 || months > 120000)
199 {
200 throw new ArgumentOutOfRangeException("months", SR.Format(SR.ArgumentOutOfRange_Range, -120000, 120000));
201 }
203 int datePart = GetDatePart(time.Ticks, 0);
204 int datePart2 = GetDatePart(time.Ticks, 2);
205 int num = GetDatePart(time.Ticks, 3);
206 int num2 = datePart2 - 1 + months;
207 if (num2 >= 0)
208 {
209 datePart2 = num2 % 12 + 1;
210 datePart += num2 / 12;
211 }
212 else
213 {
214 datePart2 = 12 + (num2 + 1) % 12;
215 datePart += (num2 - 11) / 12;
216 }
217 int[] array = ((datePart % 4 == 0 && (datePart % 100 != 0 || datePart % 400 == 0)) ? DaysToMonth366 : DaysToMonth365);
218 int num3 = array[datePart2] - array[datePart2 - 1];
219 if (num > num3)
220 {
221 num = num3;
222 }
223 long ticks = DateToTicks(datePart, datePart2, num) + time.Ticks % 864000000000L;
225 return new DateTime(ticks);
226 }
227
228 public DateTime AddYears(DateTime time, int years)
229 {
230 return AddMonths(time, years * 12);
231 }
232
233 public int GetDayOfMonth(DateTime time)
234 {
235 return GetDatePart(time.Ticks, 3);
236 }
237
239 {
241 return (DayOfWeek)((time.Ticks / 864000000000L + 1) % 7);
242 }
243
244 public int GetDayOfYear(DateTime time)
245 {
246 return GetDatePart(time.Ticks, 1);
247 }
248
249 public int GetDaysInMonth(int year, int month, int era)
250 {
251 year = GetGregorianYear(year, era);
252 if (month < 1 || month > 12)
253 {
255 }
256 int[] array = ((year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) ? DaysToMonth366 : DaysToMonth365);
257 return array[month] - array[month - 1];
258 }
259
260 public int GetDaysInYear(int year, int era)
261 {
262 year = GetGregorianYear(year, era);
263 if (year % 4 != 0 || (year % 100 == 0 && year % 400 != 0))
264 {
265 return 365;
266 }
267 return 366;
268 }
269
270 public int GetEra(DateTime time)
271 {
272 long ticks = time.Ticks;
273 for (int i = 0; i < m_EraInfo.Length; i++)
274 {
275 if (ticks >= m_EraInfo[i].ticks)
276 {
277 return m_EraInfo[i].era;
278 }
279 }
281 }
282
283 public int GetMonth(DateTime time)
284 {
285 return GetDatePart(time.Ticks, 2);
286 }
287
288 public int GetMonthsInYear(int year, int era)
289 {
291 return 12;
292 }
293
294 public int GetYear(DateTime time)
295 {
296 long ticks = time.Ticks;
297 int datePart = GetDatePart(ticks, 0);
298 for (int i = 0; i < m_EraInfo.Length; i++)
299 {
300 if (ticks >= m_EraInfo[i].ticks)
301 {
302 return datePart - m_EraInfo[i].yearOffset;
303 }
304 }
306 }
307
308 public int GetYear(int year, DateTime time)
309 {
310 long ticks = time.Ticks;
311 for (int i = 0; i < m_EraInfo.Length; i++)
312 {
313 if (ticks >= m_EraInfo[i].ticks && year > m_EraInfo[i].yearOffset)
314 {
315 return year - m_EraInfo[i].yearOffset;
316 }
317 }
319 }
320
321 public bool IsLeapDay(int year, int month, int day, int era)
322 {
323 if (day < 1 || day > GetDaysInMonth(year, month, era))
324 {
326 }
327 if (!IsLeapYear(year, era))
328 {
329 return false;
330 }
331 if (month == 2 && day == 29)
332 {
333 return true;
334 }
335 return false;
336 }
337
338 public void ValidateYearInEra(int year, int era)
339 {
340 GetYearOffset(year, era, throwOnError: true);
341 }
342
343 public int GetLeapMonth(int year, int era)
344 {
346 return 0;
347 }
348
349 public bool IsLeapMonth(int year, int month, int era)
350 {
352 if (month < 1 || month > 12)
353 {
355 }
356 return false;
357 }
358
359 public bool IsLeapYear(int year, int era)
360 {
361 year = GetGregorianYear(year, era);
362 if (year % 4 == 0)
363 {
364 if (year % 100 == 0)
365 {
366 return year % 400 == 0;
367 }
368 return true;
369 }
370 return false;
371 }
372
373 public DateTime ToDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, int era)
374 {
375 year = GetGregorianYear(year, era);
376 long ticks = DateToTicks(year, month, day) + TimeToTicks(hour, minute, second, millisecond);
377 CheckTicksRange(ticks);
378 return new DateTime(ticks);
379 }
380
381 public int GetWeekOfYear(DateTime time, CalendarWeekRule rule, DayOfWeek firstDayOfWeek)
382 {
384 return GregorianCalendar.GetDefaultInstance().GetWeekOfYear(time, rule, firstDayOfWeek);
385 }
386
387 public int ToFourDigitYear(int year, int twoDigitYearMax)
388 {
389 if (year < 0)
390 {
392 }
393 if (year < 100)
394 {
395 int num = year % 100;
396 return (twoDigitYearMax / 100 - ((num > twoDigitYearMax % 100) ? 1 : 0)) * 100 + num;
397 }
398 if (year < m_minYear || year > m_maxYear)
399 {
401 }
402 return year;
403 }
404}
virtual DateTime MaxSupportedDateTime
Definition Calendar.cs:15
virtual DateTime MinSupportedDateTime
Definition Calendar.cs:13
static void CheckAddResult(long ticks, DateTime minValue, DateTime maxValue)
Definition Calendar.cs:89
static CultureInfo InvariantCulture
DateTime ToDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, int era)
static long GetAbsoluteDate(int year, int month, int day)
bool IsLeapDay(int year, int month, int day, int era)
static long DateToTicks(int year, int month, int day)
GregorianCalendarHelper(Calendar cal, EraInfo[] eraInfo)
int GetWeekOfYear(DateTime time, CalendarWeekRule rule, DayOfWeek firstDayOfWeek)
static long TimeToTicks(int hour, int minute, int second, int millisecond)
DateTime AddMonths(DateTime time, int months)
int ToFourDigitYear(int year, int twoDigitYearMax)
int GetYearOffset(int year, int era, bool throwOnError)
static long TimeToTicks(int hour, int minute, int second)
static string ArgumentOutOfRange_Range
Definition SR.cs:1096
static string ArgumentOutOfRange_NeedPosNum
Definition SR.cs:20
static string ArgumentOutOfRange_BadYearMonthDay
Definition SR.cs:974
static string ArgumentOutOfRange_Era
Definition SR.cs:1012
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string ArgumentOutOfRange_CalendarRange
Definition SR.cs:982
static string Argument_NoEra
Definition SR.cs:800
static string ArgumentOutOfRange_BadHourMinuteSecond
Definition SR.cs:972
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