2016-08-09 4 views
1

Я имею дело со строками, такими как следующие: 0022 GMT (0822 HKT) July 21, 2016Синтаксические избыточная информации с Joda Временем

Очевидно, что эти строки указать время суток дважды в течение двух разных часовых поясов. Может ли синтаксис шаблона Joda Time DateTimeFormat.forPattern() обрабатывать эту избыточную информацию?

Одной из возможностей было бы просто игнорировать одно из двух выражений времени 0022 GMT и 0822 HKT. Для этого потребуется какой-то шаблон, который может соответствовать той части выражения времени, которую нужно игнорировать, которая будет выглядеть примерно как Hm z '(*)' MMM dd, y.

Имеет ли такой шаблон или что-то еще, что могло бы проанализировать приведенную выше строку времени, существует в синтаксисе шаблона Joda Time?

ответ

1

Для того, чтобы игнорировать потенциально двойственную часть (повторение час, минуты и название зоны в другой зоне), вы должны написать свои собственный DateTimeParser в Joda время:

DateTimeFormatter dtf = 
    new DateTimeFormatterBuilder().appendPattern("HHmm 'GMT' (").append(
     new DateTimeParser() { 
      @Override 
      public int estimateParsedLength() { 
       return 10; 
      } 
      @Override 
      public int parseInto(DateTimeParserBucket bucket, String text, int position) { 
       int pos = position; 
       while (text.charAt(pos) != ')') { 
        pos++; 
       } 
       return pos; 
      } 
     } 
    ) 
    .appendPattern(") MMMM dd, yyyy") 
    .toFormatter() 
    .withLocale(Locale.US) 
    .withZoneUTC(); 

String input = "0022 GMT (0822 HKT) July 21, 2016";  
DateTime dt = dtf.parseDateTime(input); 
System.out.println("Joda: " + dt); // 2016-07-21T00:22:00.000Z 

Для вашей информации, Я не вижу никакого способа сделать это в Java-8 (без предварительной обработки ввода), см. Этот пример, который генерирует исключение даже при использовании необязательных разделов. Java-8 не хватает механизма для написания собственного анализатора.

DateTimeFormatter dtf = 
    DateTimeFormatter.ofPattern("HHmm z ([HHmm z]) MMMM dd, uuuu", Locale.US); 
ZonedDateTime zdt = ZonedDateTime.parse(input, dtf); // throws exception!!! 
// java.time.format.DateTimeParseException: 
// Text '0022 GMT (0822 HKT) July 21, 2016' could not be parsed at index 10 

Side Примечание: Когда вы могли бы изучить мою библиотеку Time4J, который предлагает альтернативный и более производительный разбор двигатель, подходящий для Java-8, то он предлагает более простое решение, чем Joda-Time, увидеть эту маленькую gist example.

Else писать хак обходного с использованием строки предварительной обработкой всегда возможно (интересно, когда третья сторона библиотека не допускается):

String input = "0022 GMT (0822 HKT) July 21, 2016"; 
StringBuilder sb = new StringBuilder(); 
boolean markedForRemoval = false; 
for (int i = 0; i < input.length(); i++) { 
    char c = input.charAt(i); 
    if (c == ')') { 
     markedForRemoval = false; 
    } 
    if (!markedForRemoval) { 
     sb.append(c); 
    } 
    if (c == '(') { 
     markedForRemoval = true; 
    } 
} 
input = sb.toString(); 
System.out.println(input); // 0022 GMT() July 21, 2016 
// continue parsing the changed input based on a formatter of your choice