2016-08-25 4 views
2

Я пытаюсь построить DateTimeFormatter на основе https://stackoverflow.com/a/32964692/829542 ... для проверки даты ввода. Моя логика требует форматы ниже, чтобы быть действительнымПроверка даты на Java 8 - построение форматирования

  1. YYYY-MM-dd'T'HH: мм: ss.SSSSSS
  2. гггг-мм-дд чч: мм: ss.SSSSSS

... с частью микросекунды (SSSSSS) в вышеуказанном формате является необязательным (или), если количество микросхем меньше, чем ожидаемая точность в 6 цифр - например, 333 вместо 000333, мне нужно иметь возможность pad, подтвердите и обработайте дату.

Я работаю через DateTimeFormatter построить собственный форматировщик и прибыл в ниже -

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
      .appendPattern("yyyy") 
      .appendLiteral('-') 
      .appendValue(MONTH_OF_YEAR) 
      .appendLiteral('-') 
      .appendValue(DAY_OF_MONTH) 
      .appendLiteral('T') 
      .appendPattern(" HH:mm:ss") 
      .appendPattern("[.SSSSSS]") 
      .parseDefaulting(MICRO_OF_SECOND, MICRO_OF_SECOND.range().getMinimum()) 
      .toFormatter(); 

Но это не разобрать - например, «2016-08-04T20: 43: 30», как действительная дата, а также я не уверен, как заполнять цифры. Я вижу, что в DateTimeFormatter есть методы пэдов, но я не уверен, как их использовать для получения желаемого результата. Я единственный, кто чувствует, что есть много, чтобы потреблять с Документами Java и следовать!

Любой советник оценен!

Update 1:

На основании ответа от @mtj, смог продолжить решение, чтобы покрыть большую часть проблемы. Единственный незавершенный предмет теперь состоит в том, чтобы сделать no. микросекунд, заданных в дате гибкой ширины от 0 до 6. В настоящий момент действительна только 0 и 6 цифр.

public class Test { 

    public static void main(String[] args) 
    { 
     System.out.println("Date 1 - 2016-08-04T20:43:30 = " + Test.isValid("2016-08-04T20:43:30")); // true 
     System.out.println("Date 2 - 2016-08-04 20:43:30 = " + Test.isValid("2016-08-04 23:43:30")); // true 

     System.out.println("Date 3 - 2016-08-04T20:43:30.123121 = " + Test.isValid("2016-08-04T20:43:30.123121")); // true 
     System.out.println("Date 4 - 2016-08-04 20:43:30.123131 = " + Test.isValid("2016-08-04 20:43:30.123131")); // true 

     System.out.println("Date 5 - 2016-08-04'T'20:43:30.123121 = " + Test.isValid("2016-08-04'T'20:43:30.123121")); // true 

     System.out.println("Date 6 - 2016-08-04'T' 20:43:30.123121 = " + Test.isValid("2016-08-04'T' 20:43:30.123121")); // false (as expected) 

     System.out.println("Date 7 - 2016-08-04T20:43:30.123 = " + Test.isValid("2016-08-04T20:43:30.123")); // false 
     System.out.println("Date 8 - 2016-08-04T20:43:30.123 = " + Test.isValid("2016-08-04 20:43:30.123")); // false 
    } 

    public static boolean isValid(String inputDate) 
    { 
     DateTimeFormatter charLiteralTFormat = getDateFormat() 
       .appendOptional(new DateTimeFormatterBuilder().appendLiteral("'").toFormatter()) 
       .appendOptional(new DateTimeFormatterBuilder().appendLiteral('T').toFormatter()) 
       .appendOptional(new DateTimeFormatterBuilder().appendLiteral("'").toFormatter()) 
       .append(getTimeFormat().toFormatter()) 
       .toFormatter(); 

     DateTimeFormatter spaceBtwnDttmFormat = getDateFormat() 
       .appendOptional(new DateTimeFormatterBuilder().appendLiteral(' ').toFormatter()) 
       .append(getTimeFormat().toFormatter()) 
       .toFormatter(); 

     DateTimeFormatter[] formatters = { 
       charLiteralTFormat, spaceBtwnDttmFormat}; 

     for(DateTimeFormatter formatter : formatters) { 
      try { 
       LocalDate.parse(inputDate, formatter); 
       return true; 
      } catch (DateTimeParseException e) { 
       //System.out.println(" Invalid Date ... "); 
      } 
     } 

     return false; 
    } 

    public static DateTimeFormatterBuilder getDateFormat(){ 
     DateTimeFormatterBuilder baseFormat = new DateTimeFormatterBuilder() 
       .appendPattern("yyyy") 
       .appendLiteral('-') 
       .appendValue(MONTH_OF_YEAR) 
       .appendLiteral('-') 
       .appendValue(DAY_OF_MONTH); 

     return baseFormat; 
    } 

    public static DateTimeFormatterBuilder getTimeFormat() { 
     DateTimeFormatterBuilder timeFormat = new DateTimeFormatterBuilder() 
       .appendPattern("HH:mm:ss") 
       .appendOptional(new DateTimeFormatterBuilder().appendLiteral('.').toFormatter()) 
       .appendOptional(new DateTimeFormatterBuilder().appendValue(ChronoField.MICRO_OF_SECOND,6).toFormatter()); 

     return timeFormat; 
    } 
} 

Выход

// Output - 
// Validation going as expected 
Date 1 - 2016-08-04T20:43:30 = true 
Date 2 - 2016-08-04 20:43:30 = true 
Date 3 - 2016-08-04T20:43:30.123121 = true 
Date 4 - 2016-08-04 20:43:30.123131 = true 
Date 5 - 2016-08-04'T'20:43:30.123121 = true 
Date 6 - 2016-08-04'T' 20:43:30.123121 = false 

// Output - 
// Validation NOT going as expected 
Date 7 - 2016-08-04T20:43:30.123 = false 
Date 8 - 2016-08-04T20:43:30.123 = false 
+0

является формат # 1 «YYYY-MM -dd'T'HH: mm: ss.SSSSSS "или" yyyy-MM-ddTHH: mm: ss.SSSSSS "? Ваш пример не соответствует формату # 1 или # 2. –

ответ

0

Проблема с примером и ввода Размещенное Вами заготовки предшествующего час. Удалите это, и он работает.

Обратите внимание, что это будет не проанализируйте оба шаблона, в которых вы нуждаетесь.

Я думаю, следующее будет ближе к вашим требованиям, даже если он будет принимать комбинацию «T» и заготовок, должны быть незаконными:

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
     .appendPattern("yyyy") 
     .appendLiteral('-') 
     .appendValue(ChronoField.MONTH_OF_YEAR) 
     .appendLiteral('-') 
     .appendValue(ChronoField.DAY_OF_MONTH) 
     .appendOptional(new DateTimeFormatterBuilder().appendLiteral('T').toFormatter()) 
     .appendOptional(new DateTimeFormatterBuilder().appendLiteral(' ').toFormatter()) 
     .appendPattern("HH:mm:ss") 
     .appendOptional(new DateTimeFormatterBuilder().appendPattern(".SSSSSS").toFormatter()) 
     .toFormatter(); 
+0

Обновлен ответ на основе вашего решения, которое решает большинство моих требований (в том числе не имея дополнительного пространства и буква «T» одновременно). Только ожидающий элемент - это переменная ширина микросекунд. благодаря – Satya

Смежные вопросы