Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ TryParse() [3/3]

static unsafe bool System.DateTimeParse.TryParse ( ReadOnlySpan< char > s,
DateTimeFormatInfo dtfi,
DateTimeStyles styles,
ref DateTimeResult result )
inlinestaticpackage

Definition at line 2300 of file DateTimeParse.cs.

2301 {
2302 if (s.Length == 0)
2303 {
2304 result.SetFailure(ParseFailureKind.FormatWithParameter, "Format_BadDateTime");
2305 return false;
2306 }
2307 DS dS = DS.BEGIN;
2308 bool flag = false;
2309 DateTimeToken dtok = default(DateTimeToken);
2310 dtok.suffix = TokenType.SEP_Unk;
2311 DateTimeRawInfo raw = default(DateTimeRawInfo);
2312 int* numberBuffer = stackalloc int[3];
2313 raw.Init(numberBuffer);
2314 raw.hasSameDateAndTimeSeparators = dtfi.DateSeparator.Equals(dtfi.TimeSeparator, StringComparison.Ordinal);
2315 result.calendar = dtfi.Calendar;
2316 result.era = 0;
2317 __DTString str = new __DTString(s, dtfi);
2318 str.GetNext();
2319 do
2320 {
2321 if (!Lex(dS, ref str, ref dtok, ref raw, ref result, ref dtfi, styles))
2322 {
2323 return false;
2324 }
2325 if (dtok.dtt == DTT.Unk)
2326 {
2327 continue;
2328 }
2329 if (dtok.suffix != TokenType.SEP_Unk)
2330 {
2331 if (!ProcessDateTimeSuffix(ref result, ref raw, ref dtok))
2332 {
2333 result.SetBadDateTimeFailure();
2334 return false;
2335 }
2336 dtok.suffix = TokenType.SEP_Unk;
2337 }
2338 if (dtok.dtt == DTT.NumLocalTimeMark)
2339 {
2340 if (dS == DS.D_YNd || dS == DS.D_YN)
2341 {
2342 return ParseISO8601(ref raw, ref str, styles, ref result);
2343 }
2344 result.SetBadDateTimeFailure();
2345 return false;
2346 }
2347 if (raw.hasSameDateAndTimeSeparators)
2348 {
2349 if (dtok.dtt == DTT.YearEnd || dtok.dtt == DTT.YearSpace || dtok.dtt == DTT.YearDateSep)
2350 {
2351 if (dS == DS.T_Nt)
2352 {
2353 dS = DS.D_Nd;
2354 }
2355 if (dS == DS.T_NNt)
2356 {
2357 dS = DS.D_NNd;
2358 }
2359 }
2360 bool flag2 = str.AtEnd();
2361 if (s_dateParsingStates[(int)dS][(int)dtok.dtt] == DS.ERROR || flag2)
2362 {
2363 switch (dtok.dtt)
2364 {
2365 case DTT.YearDateSep:
2366 dtok.dtt = (flag2 ? DTT.YearEnd : DTT.YearSpace);
2367 break;
2368 case DTT.NumDatesep:
2369 dtok.dtt = (flag2 ? DTT.NumEnd : DTT.NumSpace);
2370 break;
2371 case DTT.NumTimesep:
2372 dtok.dtt = (flag2 ? DTT.NumEnd : DTT.NumSpace);
2373 break;
2374 case DTT.MonthDatesep:
2375 dtok.dtt = (flag2 ? DTT.MonthEnd : DTT.MonthSpace);
2376 break;
2377 }
2378 }
2379 }
2380 dS = s_dateParsingStates[(int)dS][(int)dtok.dtt];
2381 if (dS == DS.ERROR)
2382 {
2383 result.SetBadDateTimeFailure();
2384 return false;
2385 }
2386 if (dS <= DS.ERROR)
2387 {
2388 continue;
2389 }
2390 if ((dtfi.FormatFlags & DateTimeFormatFlags.UseHebrewRule) != 0)
2391 {
2392 if (!ProcessHebrewTerminalState(dS, ref result, ref styles, ref raw, dtfi))
2393 {
2394 return false;
2395 }
2396 }
2397 else if (!ProcessTerminalState(dS, ref result, ref styles, ref raw, dtfi))
2398 {
2399 return false;
2400 }
2401 flag = true;
2402 dS = DS.BEGIN;
2403 }
2404 while (dtok.dtt != 0 && dtok.dtt != DTT.NumEnd && dtok.dtt != DTT.MonthEnd);
2405 if (!flag)
2406 {
2407 result.SetBadDateTimeFailure();
2408 return false;
2409 }
2410 AdjustTimeMark(dtfi, ref raw);
2411 if (!AdjustHour(ref result.Hour, raw.timeMark))
2412 {
2413 result.SetBadDateTimeFailure();
2414 return false;
2415 }
2416 bool bTimeOnly = result.Year == -1 && result.Month == -1 && result.Day == -1;
2417 if (!CheckDefaultDateTime(ref result, ref result.calendar, styles))
2418 {
2419 return false;
2420 }
2421 if (!result.calendar.TryToDateTime(result.Year, result.Month, result.Day, result.Hour, result.Minute, result.Second, 0, result.era, out var result2))
2422 {
2423 result.SetFailure(ParseFailureKind.FormatBadDateTimeCalendar, "Format_BadDateTimeCalendar");
2424 return false;
2425 }
2426 if (raw.fraction > 0.0 && !result2.TryAddTicks((long)Math.Round(raw.fraction * 10000000.0), out result2))
2427 {
2428 result.SetBadDateTimeFailure();
2429 return false;
2430 }
2431 if (raw.dayOfWeek != -1 && raw.dayOfWeek != (int)result.calendar.GetDayOfWeek(result2))
2432 {
2433 result.SetFailure(ParseFailureKind.FormatWithOriginalDateTime, "Format_BadDayOfWeek");
2434 return false;
2435 }
2436 result.parsedDate = result2;
2437 if (!DetermineTimeZoneAdjustments(ref result, styles, bTimeOnly))
2438 {
2439 return false;
2440 }
2441 return true;
2442 }
static readonly DS[][] s_dateParsingStates
static bool DetermineTimeZoneAdjustments(ref DateTimeResult result, DateTimeStyles styles, bool bTimeOnly)
static bool CheckDefaultDateTime(ref DateTimeResult result, ref Calendar cal, DateTimeStyles styles)
static void AdjustTimeMark(DateTimeFormatInfo dtfi, ref DateTimeRawInfo raw)
static bool Lex(DS dps, ref __DTString str, ref DateTimeToken dtok, ref DateTimeRawInfo raw, ref DateTimeResult result, ref DateTimeFormatInfo dtfi, DateTimeStyles styles)
static bool ProcessDateTimeSuffix(ref DateTimeResult result, ref DateTimeRawInfo raw, ref DateTimeToken dtok)
static bool ProcessTerminalState(DS dps, ref DateTimeResult result, ref DateTimeStyles styles, ref DateTimeRawInfo raw, DateTimeFormatInfo dtfi)
static bool ProcessHebrewTerminalState(DS dps, ref DateTimeResult result, ref DateTimeStyles styles, ref DateTimeRawInfo raw, DateTimeFormatInfo dtfi)
static bool ParseISO8601(ref DateTimeRawInfo raw, ref __DTString str, DateTimeStyles styles, ref DateTimeResult result)
static bool AdjustHour(ref int hour, TM timeMark)

References System.DateTimeParse.AdjustHour(), System.DateTimeParse.AdjustTimeMark(), System.Globalization.DateTimeFormatInfo.Calendar, System.DateTimeParse.CheckDefaultDateTime(), System.Globalization.DateTimeFormatInfo.DateSeparator, System.DateTimeRawInfo.dayOfWeek, System.DateTimeParse.DetermineTimeZoneAdjustments(), System.DateTimeToken.dtt, System.DateTimeRawInfo.fraction, System.DateTimeRawInfo.Init(), System.DateTimeParse.Lex(), System.DateTimeParse.ParseISO8601(), System.DateTimeParse.ProcessDateTimeSuffix(), System.DateTimeParse.ProcessHebrewTerminalState(), System.DateTimeParse.ProcessTerminalState(), System.Math.Round(), System.s, System.DateTimeParse.s_dateParsingStates, System.str, and System.DateTimeRawInfo.timeMark.