Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
BinXmlDateTime.cs
Go to the documentation of this file.
2using System.Text;
3
4namespace System.Xml;
5
6internal abstract class BinXmlDateTime
7{
8 internal static int[] KatmaiTimeScaleMultiplicator = new int[8] { 10000000, 1000000, 100000, 10000, 1000, 100, 10, 1 };
9
10 private static void Write2Dig(StringBuilder sb, int val)
11 {
12 sb.Append((char)(48 + val / 10));
13 sb.Append((char)(48 + val % 10));
14 }
15
16 private static void Write4DigNeg(StringBuilder sb, int val)
17 {
18 if (val < 0)
19 {
20 val = -val;
21 sb.Append('-');
22 }
23 Write2Dig(sb, val / 100);
24 Write2Dig(sb, val % 100);
25 }
26
27 private static void Write3Dec(StringBuilder sb, int val)
28 {
29 int num = val % 10;
30 val /= 10;
31 int num2 = val % 10;
32 val /= 10;
33 int num3 = val;
34 sb.Append('.');
35 sb.Append((char)(48 + num3));
36 sb.Append((char)(48 + num2));
37 sb.Append((char)(48 + num));
38 }
39
40 private static void WriteDate(StringBuilder sb, int yr, int mnth, int day)
41 {
42 Write4DigNeg(sb, yr);
43 sb.Append('-');
44 Write2Dig(sb, mnth);
45 sb.Append('-');
46 Write2Dig(sb, day);
47 }
48
49 private static void WriteTime(StringBuilder sb, int hr, int min, int sec, int ms)
50 {
51 Write2Dig(sb, hr);
52 sb.Append(':');
53 Write2Dig(sb, min);
54 sb.Append(':');
55 Write2Dig(sb, sec);
56 if (ms != 0)
57 {
58 Write3Dec(sb, ms);
59 }
60 }
61
62 private static void WriteTimeFullPrecision(StringBuilder sb, int hr, int min, int sec, int fraction)
63 {
64 Write2Dig(sb, hr);
65 sb.Append(':');
66 Write2Dig(sb, min);
67 sb.Append(':');
68 Write2Dig(sb, sec);
69 if (fraction != 0)
70 {
71 int num = 7;
72 while (fraction % 10 == 0)
73 {
74 num--;
75 fraction /= 10;
76 }
77 char[] array = new char[num];
78 while (num > 0)
79 {
80 num--;
81 array[num] = (char)(fraction % 10 + 48);
82 fraction /= 10;
83 }
84 sb.Append('.');
85 sb.Append(array);
86 }
87 }
88
89 private static void WriteTimeZone(StringBuilder sb, TimeSpan zone)
90 {
91 bool negTimeZone = true;
92 if (zone.Ticks < 0)
93 {
94 negTimeZone = false;
95 zone = zone.Negate();
96 }
97 WriteTimeZone(sb, negTimeZone, zone.Hours, zone.Minutes);
98 }
99
100 private static void WriteTimeZone(StringBuilder sb, bool negTimeZone, int hr, int min)
101 {
102 if (hr == 0 && min == 0)
103 {
104 sb.Append('Z');
105 return;
106 }
107 sb.Append(negTimeZone ? '+' : '-');
108 Write2Dig(sb, hr);
109 sb.Append(':');
110 Write2Dig(sb, min);
111 }
112
113 private static void BreakDownXsdDateTime(long val, out int yr, out int mnth, out int day, out int hr, out int min, out int sec, out int ms)
114 {
115 if (val >= 0)
116 {
117 long num = val / 4;
118 ms = (int)(num % 1000);
119 num /= 1000;
120 sec = (int)(num % 60);
121 num /= 60;
122 min = (int)(num % 60);
123 num /= 60;
124 hr = (int)(num % 24);
125 num /= 24;
126 day = (int)(num % 31) + 1;
127 num /= 31;
128 mnth = (int)(num % 12) + 1;
129 num /= 12;
130 yr = (int)(num - 9999);
131 if (yr >= -9999 && yr <= 9999)
132 {
133 return;
134 }
135 }
136 throw new XmlException(System.SR.SqlTypes_ArithOverflow, (string)null);
137 }
138
139 private static void BreakDownXsdDate(long val, out int yr, out int mnth, out int day, out bool negTimeZone, out int hr, out int min)
140 {
141 if (val >= 0)
142 {
143 val /= 4;
144 int num = (int)(val % 1740) - 840;
145 long num2 = val / 1740;
146 if (negTimeZone = num < 0)
147 {
148 num = -num;
149 }
150 min = num % 60;
151 hr = num / 60;
152 day = (int)(num2 % 31) + 1;
153 num2 /= 31;
154 mnth = (int)(num2 % 12) + 1;
155 yr = (int)(num2 / 12) - 9999;
156 if (yr >= -9999 && yr <= 9999)
157 {
158 return;
159 }
160 }
161 throw new XmlException(System.SR.SqlTypes_ArithOverflow, (string)null);
162 }
163
164 private static void BreakDownXsdTime(long val, out int hr, out int min, out int sec, out int ms)
165 {
166 if (val >= 0)
167 {
168 val /= 4;
169 ms = (int)(val % 1000);
170 val /= 1000;
171 sec = (int)(val % 60);
172 val /= 60;
173 min = (int)(val % 60);
174 hr = (int)(val / 60);
175 if (0 <= hr && hr <= 23)
176 {
177 return;
178 }
179 }
180 throw new XmlException(System.SR.SqlTypes_ArithOverflow, (string)null);
181 }
182
183 public static string XsdDateTimeToString(long val)
184 {
188 stringBuilder.Append('T');
190 stringBuilder.Append('Z');
191 return stringBuilder.ToString();
192 }
193
194 public static DateTime XsdDateTimeToDateTime(long val)
195 {
197 return new DateTime(yr, mnth, day, hr, min, sec, ms, DateTimeKind.Utc);
198 }
199
200 public static string XsdDateToString(long val)
201 {
206 return stringBuilder.ToString();
207 }
208
209 public static DateTime XsdDateToDateTime(long val)
210 {
212 DateTime dateTime = new DateTime(yr, mnth, day, 0, 0, 0, DateTimeKind.Utc);
213 int num = ((!negTimeZone) ? 1 : (-1)) * (hr * 60 + min);
214 return TimeZoneInfo.ConvertTime(dateTime.AddMinutes(num), TimeZoneInfo.Local);
215 }
216
217 public static string XsdTimeToString(long val)
218 {
222 stringBuilder.Append('Z');
223 return stringBuilder.ToString();
224 }
225
226 public static DateTime XsdTimeToDateTime(long val)
227 {
229 return new DateTime(1, 1, 1, hr, min, sec, ms, DateTimeKind.Utc);
230 }
231
232 public static string SqlDateTimeToString(int dateticks, uint timeticks)
233 {
235 string text = ((dateTime.Millisecond != 0) ? "yyyy/MM/dd\\THH:mm:ss.ffff" : "yyyy/MM/dd\\THH:mm:ss");
236 return dateTime.ToString(text, CultureInfo.InvariantCulture);
237 }
238
240 {
241 DateTime dateTime = new DateTime(1900, 1, 1);
242 long num = (long)((double)timeticks / 0.3 + 0.5);
243 return dateTime.Add(new TimeSpan(dateticks * 864000000000L + num * 10000));
244 }
245
246 public static string SqlSmallDateTimeToString(short dateticks, ushort timeticks)
247 {
248 return SqlSmallDateTimeToDateTime(dateticks, timeticks).ToString("yyyy/MM/dd\\THH:mm:ss", CultureInfo.InvariantCulture);
249 }
250
252 {
253 return SqlDateTimeToDateTime(dateticks, (uint)(timeticks * 18000));
254 }
255
256 public static DateTime XsdKatmaiDateToDateTime(byte[] data, int offset)
257 {
259 return new DateTime(katmaiDateTicks);
260 }
261
262 public static DateTime XsdKatmaiDateTimeToDateTime(byte[] data, int offset)
263 {
267 }
268
269 public static DateTime XsdKatmaiTimeToDateTime(byte[] data, int offset)
270 {
272 }
273
274 public static DateTime XsdKatmaiDateOffsetToDateTime(byte[] data, int offset)
275 {
276 return XsdKatmaiDateOffsetToDateTimeOffset(data, offset).LocalDateTime;
277 }
278
279 public static DateTime XsdKatmaiDateTimeOffsetToDateTime(byte[] data, int offset)
280 {
281 return XsdKatmaiDateTimeOffsetToDateTimeOffset(data, offset).LocalDateTime;
282 }
283
284 public static DateTime XsdKatmaiTimeOffsetToDateTime(byte[] data, int offset)
285 {
286 return XsdKatmaiTimeOffsetToDateTimeOffset(data, offset).LocalDateTime;
287 }
288
293
301
306
307 public static string XsdKatmaiDateToString(byte[] data, int offset)
308 {
312 return stringBuilder.ToString();
313 }
314
315 public static string XsdKatmaiDateTimeToString(byte[] data, int offset)
316 {
319 WriteDate(stringBuilder, dt.Year, dt.Month, dt.Day);
320 stringBuilder.Append('T');
321 WriteTimeFullPrecision(stringBuilder, dt.Hour, dt.Minute, dt.Second, GetFractions(dt));
322 return stringBuilder.ToString();
323 }
324
325 public static string XsdKatmaiTimeToString(byte[] data, int offset)
326 {
329 WriteTimeFullPrecision(stringBuilder, dt.Hour, dt.Minute, dt.Second, GetFractions(dt));
330 return stringBuilder.ToString();
331 }
332
341
342 public static string XsdKatmaiDateTimeOffsetToString(byte[] data, int offset)
343 {
346 WriteDate(stringBuilder, dt.Year, dt.Month, dt.Day);
347 stringBuilder.Append('T');
348 WriteTimeFullPrecision(stringBuilder, dt.Hour, dt.Minute, dt.Second, GetFractions(dt));
350 return stringBuilder.ToString();
351 }
352
353 public static string XsdKatmaiTimeOffsetToString(byte[] data, int offset)
354 {
357 WriteTimeFullPrecision(stringBuilder, dt.Hour, dt.Minute, dt.Second, GetFractions(dt));
359 return stringBuilder.ToString();
360 }
361
362 private static long GetKatmaiDateTicks(byte[] data, ref int pos)
363 {
364 int num = pos;
365 pos = num + 3;
366 return (data[num] | (data[num + 1] << 8) | (data[num + 2] << 16)) * 864000000000L;
367 }
368
369 private static long GetKatmaiTimeTicks(byte[] data, ref int pos)
370 {
371 int num = pos;
372 byte b = data[num];
373 num++;
374 long num2;
375 if (b <= 2)
376 {
377 num2 = data[num] | (data[num + 1] << 8) | (data[num + 2] << 16);
378 pos = num + 3;
379 }
380 else if (b <= 4)
381 {
382 num2 = data[num] | (data[num + 1] << 8) | (data[num + 2] << 16);
383 num2 |= (long)((ulong)data[num + 3] << 24);
384 pos = num + 4;
385 }
386 else
387 {
388 if (b > 7)
389 {
390 throw new XmlException(System.SR.SqlTypes_ArithOverflow, (string)null);
391 }
392 num2 = data[num] | (data[num + 1] << 8) | (data[num + 2] << 16);
393 num2 |= (long)(((ulong)data[num + 3] << 24) | ((ulong)data[num + 4] << 32));
394 pos = num + 5;
395 }
397 }
398
399 private static long GetKatmaiTimeZoneTicks(byte[] data, int pos)
400 {
401 return (long)(short)(data[pos] | (data[pos + 1] << 8)) * 600000000L;
402 }
403
404 private static int GetFractions(DateTime dt)
405 {
406 return (int)(dt.Ticks - new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second).Ticks);
407 }
408
409 private static int GetFractions(DateTimeOffset dt)
410 {
411 return (int)(dt.Ticks - new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second).Ticks);
412 }
413}
static CultureInfo InvariantCulture
static string SqlTypes_ArithOverflow
Definition SR.cs:1390
Definition SR.cs:7
StringBuilder Append(char value, int repeatCount)
static TimeZoneInfo Local
static DateTimeOffset ConvertTime(DateTimeOffset dateTimeOffset, TimeZoneInfo destinationTimeZone)
static long GetKatmaiTimeTicks(byte[] data, ref int pos)
static DateTime XsdKatmaiDateOffsetToDateTime(byte[] data, int offset)
static void WriteDate(StringBuilder sb, int yr, int mnth, int day)
static string XsdKatmaiTimeToString(byte[] data, int offset)
static int GetFractions(DateTimeOffset dt)
static void BreakDownXsdTime(long val, out int hr, out int min, out int sec, out int ms)
static long GetKatmaiDateTicks(byte[] data, ref int pos)
static void Write3Dec(StringBuilder sb, int val)
static int[] KatmaiTimeScaleMultiplicator
static string XsdKatmaiDateToString(byte[] data, int offset)
static DateTimeOffset XsdKatmaiTimeOffsetToDateTimeOffset(byte[] data, int offset)
static string XsdKatmaiDateTimeOffsetToString(byte[] data, int offset)
static string SqlSmallDateTimeToString(short dateticks, ushort timeticks)
static string XsdKatmaiTimeOffsetToString(byte[] data, int offset)
static DateTime XsdKatmaiDateToDateTime(byte[] data, int offset)
static void WriteTimeFullPrecision(StringBuilder sb, int hr, int min, int sec, int fraction)
static int GetFractions(DateTime dt)
static DateTime XsdKatmaiTimeOffsetToDateTime(byte[] data, int offset)
static DateTime XsdDateTimeToDateTime(long val)
static DateTime XsdKatmaiDateTimeOffsetToDateTime(byte[] data, int offset)
static string XsdDateToString(long val)
static DateTime XsdTimeToDateTime(long val)
static DateTime XsdKatmaiDateTimeToDateTime(byte[] data, int offset)
static void WriteTime(StringBuilder sb, int hr, int min, int sec, int ms)
static string XsdKatmaiDateTimeToString(byte[] data, int offset)
static DateTime XsdDateToDateTime(long val)
static void Write4DigNeg(StringBuilder sb, int val)
static string SqlDateTimeToString(int dateticks, uint timeticks)
static string XsdDateTimeToString(long val)
static DateTime SqlDateTimeToDateTime(int dateticks, uint timeticks)
static void WriteTimeZone(StringBuilder sb, bool negTimeZone, int hr, int min)
static void WriteTimeZone(StringBuilder sb, TimeSpan zone)
static DateTimeOffset XsdKatmaiDateTimeOffsetToDateTimeOffset(byte[] data, int offset)
static void Write2Dig(StringBuilder sb, int val)
static string XsdTimeToString(long val)
static void BreakDownXsdDateTime(long val, out int yr, out int mnth, out int day, out int hr, out int min, out int sec, out int ms)
static long GetKatmaiTimeZoneTicks(byte[] data, int pos)
static DateTime SqlSmallDateTimeToDateTime(short dateticks, ushort timeticks)
static DateTime XsdKatmaiTimeToDateTime(byte[] data, int offset)
static DateTimeOffset XsdKatmaiDateOffsetToDateTimeOffset(byte[] data, int offset)
static string XsdKatmaiDateOffsetToString(byte[] data, int offset)
static void BreakDownXsdDate(long val, out int yr, out int mnth, out int day, out bool negTimeZone, out int hr, out int min)