| 2215 | } |
| 2216 | |
| 2217 | std::shared_ptr<DateTimeFormatter> buildHiveDateTimeFormatter( |
| 2218 | const std::string_view& format) { |
| 2219 | if (format.empty()) { |
| 2220 | BOLT_USER_FAIL("Invalid pattern specification"); |
| 2221 | } |
| 2222 | |
| 2223 | DateTimeFormatterBuilder builder(format.size()); |
| 2224 | |
| 2225 | const char* cur = format.data(); |
| 2226 | const char* end = cur + format.size(); |
| 2227 | while (cur < end) { |
| 2228 | auto tokenEnd = cur; |
| 2229 | if (*tokenEnd == '%') { // pattern |
| 2230 | ++tokenEnd; |
| 2231 | if (tokenEnd == end) { |
| 2232 | break; |
| 2233 | } |
| 2234 | switch (*tokenEnd) { |
| 2235 | case 'C': |
| 2236 | builder.appendCenturyOfEra(2); |
| 2237 | break; |
| 2238 | case 'd': |
| 2239 | builder.appendDayOfMonth(2); |
| 2240 | break; |
| 2241 | case 'D': |
| 2242 | builder.appendMonthOfYear(2); |
| 2243 | builder.appendLiteral("/"); |
| 2244 | builder.appendDayOfMonth(2); |
| 2245 | builder.appendLiteral("/"); |
| 2246 | builder.appendYear(4); |
| 2247 | break; |
| 2248 | case 'e': |
| 2249 | builder.appendDayOfMonth(1); |
| 2250 | break; |
| 2251 | case 'F': |
| 2252 | builder.appendYear(4); |
| 2253 | builder.appendLiteral("/"); |
| 2254 | builder.appendMonthOfYear(2); |
| 2255 | builder.appendLiteral("/"); |
| 2256 | builder.appendDayOfMonth(2); |
| 2257 | break; |
| 2258 | case 'H': |
| 2259 | builder.appendHourOfDay(2); |
| 2260 | break; |
| 2261 | case 'I': |
| 2262 | builder.appendClockHourOfHalfDay(2); |
| 2263 | break; |
| 2264 | case 'j': |
| 2265 | builder.appendDayOfYear(3); |
| 2266 | break; |
| 2267 | case 'm': |
| 2268 | builder.appendMonthOfYear(2); |
| 2269 | break; |
| 2270 | case 'M': |
| 2271 | builder.appendMinuteOfHour(2); |
| 2272 | break; |
| 2273 | case 'n': |
| 2274 | builder.appendLiteral("\n"); |