static { DateTimeParser[] parsers = new DateTimeParser[] { DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss Z yyyy").withZoneUTC().getParser(), DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss Z").getParser(), DateTimeFormat.forPattern("dd MMMM yyyy HH:mm:ss").withZoneUTC().getParser(), DateTimeFormat.forPattern("yyyyMMdd").withZoneUTC().getParser(), DateTimeFormat.forPattern("dd-MM-yyyy").withZoneUTC().getParser(), DateTimeFormat.forPattern("yyyy-MM-dd").withZoneUTC().getParser(), DateTimeFormat.forPattern("yyyy/MM/dd").withZoneUTC().getParser(), DateTimeFormat.forPattern("dd MMM yyyy").withZoneUTC().getParser(), DateTimeFormat.forPattern("dd MMMM yyyy").withZoneUTC().getParser(), DateTimeFormat.forPattern("yyyyMMddHHmm").withZoneUTC().getParser(), DateTimeFormat.forPattern("yyyyMMdd HHmm").withZoneUTC().getParser(), DateTimeFormat.forPattern("dd-MM-yyyy HH:mm").withZoneUTC().getParser(), DateTimeFormat.forPattern("yyyy-MM-dd HH:mm").withZoneUTC().getParser(), DateTimeFormat.forPattern("yyyy/MM/dd HH:mm").withZoneUTC().getParser(), DateTimeFormat.forPattern("dd MMM yyyy HH:mm").withZoneUTC().getParser(), DateTimeFormat.forPattern("dd MMMM yyyy HH:mm").withZoneUTC().getParser(), DateTimeFormat.forPattern("yyyyMMddHHmmss").withZoneUTC().getParser(), DateTimeFormat.forPattern("yyyyMMdd HHmmss").withZoneUTC().getParser(), DateTimeFormat.forPattern("dd-MM-yyyy HH:mm:ss").withZoneUTC().getParser(), DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withZoneUTC().getParser(), DateTimeFormat.forPattern("yyyy/MM/dd HH:mm:ss").withZoneUTC().getParser(), DateTimeFormat.forPattern("dd MMM yyyy HH:mm:ss").withZoneUTC().getParser(), DateTimeFormat.forPattern("HH:mm:ss yyyy/MM/dd").withZoneUTC().getParser(), DateTimeFormat.forPattern("HH:mm:ss MM/dd/yyyy").withZoneUTC().getParser(), DateTimeFormat.forPattern("HH:mm:ss yyyy-MM-dd").withZoneUTC().getParser(), DateTimeFormat.forPattern("HH:mm:ss MM-dd-yyyy").withZoneUTC().getParser(), DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").withZoneUTC().getParser(), DateTimeFormat.forPattern("dd/MM/yyyy HH:mm").withZoneUTC().getParser(), DateTimeFormat.forPattern("dd/MM/yyyy").withZoneUTC().getParser(), UTC_STANDARD_FMT.getParser(), UTC_SUB_SECOND_FMT.getParser(), LOCAL_STANDARD_FMT.getParser(), LOCAL_SUB_SECOND_FMT.getParser() }; DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); builder.append(null, parsers); DEFAULT_FORMATTER = builder.toFormatter().withZoneUTC(); DateTimeParser[] altParsers = new DateTimeParser[] { DateTimeFormat.forPattern("MM-dd-yyyy HH:mm:ss").withZoneUTC().getParser(), DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss").withZoneUTC().getParser(), DateTimeFormat.forPattern("MM/dd/yyyy HH:mm").withZoneUTC().getParser(), DateTimeFormat.forPattern("MM/dd/yyyy").withZoneUTC().getParser(), }; builder = new DateTimeFormatterBuilder(); builder.append(null, altParsers); ALT_FORMATTER = builder.toFormatter().withZoneUTC(); }
@Test public void testMultiParsers() { DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); DateTimeParser[] parsers = new DateTimeParser[3]; parsers[0] = DateTimeFormat.forPattern("MM/dd/yyyy").withZone(DateTimeZone.UTC).getParser(); parsers[1] = DateTimeFormat.forPattern("MM-dd-yyyy").withZone(DateTimeZone.UTC).getParser(); parsers[2] = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withZone(DateTimeZone.UTC).getParser(); builder.append( DateTimeFormat.forPattern("MM/dd/yyyy").withZone(DateTimeZone.UTC).getPrinter(), parsers); DateTimeFormatter formatter = builder.toFormatter(); formatter.parseMillis("2009-11-15 14:12:12"); }
@SuppressWarnings("fallthrough") public static DateTimeFormatter createDateTimeFormatter(Slice format) { DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); String formatString = format.toString(Charsets.UTF_8); boolean escaped = false; for (int i = 0; i < format.length(); i++) { char character = formatString.charAt(i); if (escaped) { switch (character) { case 'a': // %a Abbreviated weekday name (Sun..Sat) builder.appendDayOfWeekShortText(); break; case 'b': // %b Abbreviated month name (Jan..Dec) builder.appendMonthOfYearShortText(); break; case 'c': // %c Month, numeric (0..12) builder.appendMonthOfYear(1); break; case 'd': // %d Day of the month, numeric (00..31) builder.appendDayOfMonth(2); break; case 'e': // %e Day of the month, numeric (0..31) builder.appendDayOfMonth(1); break; case 'f': // %f Microseconds (000000..999999) builder.appendMillisOfSecond(6); break; case 'H': // %H Hour (00..23) builder.appendHourOfDay(2); break; case 'h': // %h Hour (01..12) case 'I': // %I Hour (01..12) builder.appendClockhourOfHalfday(2); break; case 'i': // %i Minutes, numeric (00..59) builder.appendMinuteOfHour(2); break; case 'j': // %j Day of year (001..366) builder.appendDayOfYear(3); break; case 'k': // %k Hour (0..23) builder.appendClockhourOfDay(1); break; case 'l': // %l Hour (1..12) builder.appendClockhourOfHalfday(1); break; case 'M': // %M Month name (January..December) builder.appendMonthOfYearText(); break; case 'm': // %m Month, numeric (00..12) builder.appendMonthOfYear(2); break; case 'p': // %p AM or PM builder.appendHalfdayOfDayText(); break; case 'r': // %r Time, 12-hour (hh:mm:ss followed by AM or PM) builder .appendClockhourOfHalfday(2) .appendLiteral(':') .appendMinuteOfHour(2) .appendLiteral(':') .appendSecondOfMinute(2) .appendLiteral(' ') .appendHalfdayOfDayText(); break; case 'S': // %S Seconds (00..59) case 's': // %s Seconds (00..59) builder.appendSecondOfMinute(2); break; case 'T': // %T Time, 24-hour (hh:mm:ss) builder .appendHourOfDay(2) .appendLiteral(':') .appendMinuteOfHour(2) .appendLiteral(':') .appendSecondOfMinute(2); break; case 'v': // %v Week (01..53), where Monday is the first day of the week; used with %x builder.appendWeekOfWeekyear(2); break; case 'x': // %x Year for the week, where Monday is the first day of the week, numeric, // four digits; used with %v builder.appendWeekyear(4, 4); break; case 'W': // %W Weekday name (Sunday..Saturday) builder.appendDayOfWeekText(); break; case 'w': // %w Day of the week (0=Sunday..6=Saturday) builder.appendDayOfWeek(1); break; case 'Y': // %Y Year, numeric, four digits builder.appendYear(4, 4); break; case 'y': // %y Year, numeric (two digits) builder.appendYearOfCentury(2, 2); break; case 'U': // %U Week (00..53), where Sunday is the first day of the week case 'u': // %u Week (00..53), where Monday is the first day of the week case 'V': // %V Week (01..53), where Sunday is the first day of the week; used with %X case 'X': // %X Year for the week where Sunday is the first day of the week, numeric, four // digits; used with %V case 'D': // %D Day of the month with English suffix (0th, 1st, 2nd, 3rd, …) throw new PrestoException( INVALID_FUNCTION_ARGUMENT.toErrorCode(), String.format("%%%s not supported in date format string", character)); case '%': // %% A literal “%” character builder.appendLiteral('%'); break; default: // %<x> The literal character represented by <x> builder.appendLiteral(character); break; } escaped = false; } else if (character == '%') { escaped = true; } else { builder.appendLiteral(character); } } try { return builder.toFormatter(); } catch (UnsupportedOperationException e) { throw new PrestoException(INVALID_FUNCTION_ARGUMENT.toErrorCode(), e); } }