| 49 | DateTimeFormatContext SimpleDateFormatTokenizer::DEFAULT_TIME_FRAC_CTX[10]; |
| 50 | |
| 51 | void SimpleDateFormatTokenizer::InitCtx() { |
| 52 | if (initialized) return; |
| 53 | |
| 54 | // Setup the default date/time context yyyy-MM-dd HH:mm:ss.SSSSSSSSS |
| 55 | const char* DATE_TIME_CTX_FMT = "yyyy-MM-dd HH:mm:ss.SSSSSSSSS"; |
| 56 | for (int i = FRACTIONAL_MAX_LEN; i >= 0; --i) { |
| 57 | DEFAULT_DATE_TIME_CTX[i].Reset(DATE_TIME_CTX_FMT, |
| 58 | DEFAULT_DATE_TIME_FMT_LEN - (FRACTIONAL_MAX_LEN - i)); |
| 59 | Tokenize(&DEFAULT_DATE_TIME_CTX[i], PARSE); |
| 60 | } |
| 61 | |
| 62 | // Setup the default ISO date/time context yyyy-MM-ddTHH:mm:ss.SSSSSSSSS |
| 63 | for (int i = FRACTIONAL_MAX_LEN; i >= 0; --i) { |
| 64 | DEFAULT_ISO_DATE_TIME_CTX[i].Reset("yyyy-MM-ddTHH:mm:ss.SSSSSSSSS", |
| 65 | DEFAULT_DATE_TIME_FMT_LEN - (FRACTIONAL_MAX_LEN - i)); |
| 66 | Tokenize(&DEFAULT_ISO_DATE_TIME_CTX[i], PARSE); |
| 67 | } |
| 68 | |
| 69 | // Setup the short default date/time context yyyy-MM-dd HH:mm:ss |
| 70 | DEFAULT_SHORT_DATE_TIME_CTX.Reset("yyyy-MM-dd HH:mm:ss"); |
| 71 | Tokenize(&DEFAULT_SHORT_DATE_TIME_CTX, PARSE); |
| 72 | |
| 73 | // Setup the short default ISO date/time context yyyy-MM-ddTHH:mm:ss |
| 74 | DEFAULT_SHORT_ISO_DATE_TIME_CTX.Reset("yyyy-MM-ddTHH:mm:ss"); |
| 75 | Tokenize(&DEFAULT_SHORT_ISO_DATE_TIME_CTX, PARSE); |
| 76 | |
| 77 | // Setup the default short date context yyyy-MM-dd |
| 78 | DEFAULT_DATE_CTX.Reset("yyyy-MM-dd"); |
| 79 | Tokenize(&DEFAULT_DATE_CTX, PARSE); |
| 80 | |
| 81 | // Setup the default short time context HH:mm:ss |
| 82 | DEFAULT_TIME_CTX.Reset("HH:mm:ss"); |
| 83 | Tokenize(&DEFAULT_TIME_CTX, PARSE, true, true); |
| 84 | |
| 85 | // Setup the default short time context with fractional seconds HH:mm:ss.SSSSSSSSS |
| 86 | for (int i = FRACTIONAL_MAX_LEN; i >= 0; --i) { |
| 87 | DEFAULT_TIME_FRAC_CTX[i].Reset(DATE_TIME_CTX_FMT + 11, |
| 88 | DEFAULT_TIME_FRAC_FMT_LEN - (FRACTIONAL_MAX_LEN - i)); |
| 89 | Tokenize(&DEFAULT_TIME_FRAC_CTX[i], PARSE, true, true); |
| 90 | } |
| 91 | |
| 92 | // Flag that the parser is ready. |
| 93 | initialized = true; |
| 94 | } |
| 95 | |
| 96 | bool SimpleDateFormatTokenizer::IsValidTZOffset(const char* str_begin, |
| 97 | const char* str_end) { |