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);
    }
  }