Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
PersianCalendar.cs
Go to the documentation of this file.
2
4{
5 public static readonly int PersianEra = 1;
6
7 private static readonly long s_persianEpoch = new DateTime(622, 3, 22).Ticks / 864000000000L;
8
9 private static readonly int[] s_daysToMonth = new int[13]
10 {
11 0, 31, 62, 93, 124, 155, 186, 216, 246, 276,
12 306, 336, 366
13 };
14
15 private static readonly DateTime s_minDate = new DateTime(622, 3, 22);
16
17 private static readonly DateTime s_maxDate = DateTime.MaxValue;
18
20
22
24
25 internal override CalendarId BaseCalendarID => CalendarId.GREGORIAN;
26
27 internal override CalendarId ID => CalendarId.PERSIAN;
28
29 public override int[] Eras => new int[1] { PersianEra };
30
31 public override int TwoDigitYearMax
32 {
33 get
34 {
35 if (_twoDigitYearMax == -1)
36 {
38 }
39 return _twoDigitYearMax;
40 }
41 set
42 {
44 if (value < 99 || value > 9378)
45 {
47 }
49 }
50 }
51
52 private static long GetAbsoluteDatePersian(int year, int month, int day)
53 {
54 if (year < 1 || year > 9378 || month < 1 || month > 12)
55 {
57 }
58 int num = DaysInPreviousMonths(month) + day - 1;
59 int num2 = (int)(365.242189 * (double)(year - 1));
61 return num3 + num;
62 }
63
64 internal static void CheckTicksRange(long ticks)
65 {
66 if (ticks < s_minDate.Ticks || ticks > s_maxDate.Ticks)
67 {
69 }
70 }
71
72 internal static void CheckEraRange(int era)
73 {
74 if (era != 0 && era != PersianEra)
75 {
77 }
78 }
79
80 internal static void CheckYearRange(int year, int era)
81 {
82 CheckEraRange(era);
83 if (year < 1 || year > 9378)
84 {
86 }
87 }
88
89 internal static void CheckYearMonthRange(int year, int month, int era)
90 {
91 CheckYearRange(year, era);
92 if (year == 9378 && month > 10)
93 {
94 throw new ArgumentOutOfRangeException("month", month, SR.Format(SR.ArgumentOutOfRange_Range, 1, 10));
95 }
96 if (month < 1 || month > 12)
97 {
99 }
100 }
101
102 private static int MonthFromOrdinalDay(int ordinalDay)
103 {
104 int i;
105 for (i = 0; ordinalDay > s_daysToMonth[i]; i++)
106 {
107 }
108 return i;
109 }
110
111 private static int DaysInPreviousMonths(int month)
112 {
113 month--;
114 return s_daysToMonth[month];
115 }
116
117 internal int GetDatePart(long ticks, int part)
118 {
119 CheckTicksRange(ticks);
120 long num = ticks / 864000000000L + 1;
122 int num3 = (int)Math.Floor((double)(num2 - s_persianEpoch) / 365.242189 + 0.5) + 1;
123 if (part == 0)
124 {
125 return num3;
126 }
127 int num4 = (int)(num - CalendricalCalculationsHelper.GetNumberOfDays(ToDateTime(num3, 1, 1, 0, 0, 0, 0, 1)));
128 if (part == 1)
129 {
130 return num4;
131 }
132 int num5 = MonthFromOrdinalDay(num4);
133 if (part == 2)
134 {
135 return num5;
136 }
137 int result = num4 - DaysInPreviousMonths(num5);
138 if (part == 3)
139 {
140 return result;
141 }
143 }
144
145 public override DateTime AddMonths(DateTime time, int months)
146 {
147 if (months < -120000 || months > 120000)
148 {
149 throw new ArgumentOutOfRangeException("months", months, SR.Format(SR.ArgumentOutOfRange_Range, -120000, 120000));
150 }
151 int datePart = GetDatePart(time.Ticks, 0);
152 int datePart2 = GetDatePart(time.Ticks, 2);
153 int num = GetDatePart(time.Ticks, 3);
154 int num2 = datePart2 - 1 + months;
155 if (num2 >= 0)
156 {
157 datePart2 = num2 % 12 + 1;
158 datePart += num2 / 12;
159 }
160 else
161 {
162 datePart2 = 12 + (num2 + 1) % 12;
163 datePart += (num2 - 11) / 12;
164 }
165 int daysInMonth = GetDaysInMonth(datePart, datePart2);
166 if (num > daysInMonth)
167 {
168 num = daysInMonth;
169 }
170 long ticks = GetAbsoluteDatePersian(datePart, datePart2, num) * 864000000000L + time.Ticks % 864000000000L;
172 return new DateTime(ticks);
173 }
174
175 public override DateTime AddYears(DateTime time, int years)
176 {
177 return AddMonths(time, years * 12);
178 }
179
180 public override int GetDayOfMonth(DateTime time)
181 {
182 return GetDatePart(time.Ticks, 3);
183 }
184
185 public override DayOfWeek GetDayOfWeek(DateTime time)
186 {
187 return (DayOfWeek)((int)(time.Ticks / 864000000000L + 1) % 7);
188 }
189
190 public override int GetDayOfYear(DateTime time)
191 {
192 return GetDatePart(time.Ticks, 1);
193 }
194
195 public override int GetDaysInMonth(int year, int month, int era)
196 {
197 CheckYearMonthRange(year, month, era);
198 if (month == 10 && year == 9378)
199 {
200 return 13;
201 }
202 int num = s_daysToMonth[month] - s_daysToMonth[month - 1];
203 if (month == 12 && !IsLeapYear(year))
204 {
205 num--;
206 }
207 return num;
208 }
209
210 public override int GetDaysInYear(int year, int era)
211 {
212 CheckYearRange(year, era);
213 if (year == 9378)
214 {
215 return s_daysToMonth[9] + 13;
216 }
217 if (!IsLeapYear(year, 0))
218 {
219 return 365;
220 }
221 return 366;
222 }
223
224 public override int GetEra(DateTime time)
225 {
227 return PersianEra;
228 }
229
230 public override int GetMonth(DateTime time)
231 {
232 return GetDatePart(time.Ticks, 2);
233 }
234
235 public override int GetMonthsInYear(int year, int era)
236 {
237 CheckYearRange(year, era);
238 if (year == 9378)
239 {
240 return 10;
241 }
242 return 12;
243 }
244
245 public override int GetYear(DateTime time)
246 {
247 return GetDatePart(time.Ticks, 0);
248 }
249
250 public override bool IsLeapDay(int year, int month, int day, int era)
251 {
252 int daysInMonth = GetDaysInMonth(year, month, era);
253 if (day < 1 || day > daysInMonth)
254 {
255 throw new ArgumentOutOfRangeException("day", day, SR.Format(SR.ArgumentOutOfRange_Day, daysInMonth, month));
256 }
257 if (IsLeapYear(year, era) && month == 12)
258 {
259 return day == 30;
260 }
261 return false;
262 }
263
264 public override int GetLeapMonth(int year, int era)
265 {
266 CheckYearRange(year, era);
267 return 0;
268 }
269
270 public override bool IsLeapMonth(int year, int month, int era)
271 {
272 CheckYearMonthRange(year, month, era);
273 return false;
274 }
275
276 public override bool IsLeapYear(int year, int era)
277 {
278 CheckYearRange(year, era);
279 if (year == 9378)
280 {
281 return false;
282 }
283 return GetAbsoluteDatePersian(year + 1, 1, 1) - GetAbsoluteDatePersian(year, 1, 1) == 366;
284 }
285
286 public override DateTime ToDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, int era)
287 {
288 int daysInMonth = GetDaysInMonth(year, month, era);
289 if (day < 1 || day > daysInMonth)
290 {
291 throw new ArgumentOutOfRangeException("day", day, SR.Format(SR.ArgumentOutOfRange_Day, daysInMonth, month));
292 }
293 long absoluteDatePersian = GetAbsoluteDatePersian(year, month, day);
294 if (absoluteDatePersian < 0)
295 {
297 }
298 return new DateTime(absoluteDatePersian * 864000000000L + Calendar.TimeToTicks(hour, minute, second, millisecond));
299 }
300
301 public override int ToFourDigitYear(int year)
302 {
303 if (year < 0)
304 {
306 }
307 if (year < 100)
308 {
309 return base.ToFourDigitYear(year);
310 }
311 if (year > 9378)
312 {
314 }
315 return year;
316 }
317}
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
override int GetMonthsInYear(int year, int era)
override DateTime AddMonths(DateTime time, int months)
override bool IsLeapDay(int year, int month, int day, int era)
override int GetEra(DateTime time)
static void CheckYearRange(int year, int era)
override int GetDaysInYear(int year, int era)
override int GetYear(DateTime time)
override int GetDaysInMonth(int year, int month, int era)
static int DaysInPreviousMonths(int month)
int GetDatePart(long ticks, int part)
override DateTime AddYears(DateTime time, int years)
static readonly DateTime s_minDate
override bool IsLeapMonth(int year, int month, int era)
override int GetLeapMonth(int year, int era)
static readonly DateTime s_maxDate
static void CheckYearMonthRange(int year, int month, int era)
override int GetMonth(DateTime time)
override DateTime ToDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, int era)
override CalendarAlgorithmType AlgorithmType
static void CheckTicksRange(long ticks)
override int GetDayOfMonth(DateTime time)
override DayOfWeek GetDayOfWeek(DateTime time)
override int GetDayOfYear(DateTime time)
override bool IsLeapYear(int year, int era)
static long GetAbsoluteDatePersian(int year, int month, int day)
static int MonthFromOrdinalDay(int ordinalDay)
static double Floor(double d)
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
static readonly DateTime MaxValue
Definition DateTime.cs:37