2016-01-18 4 views
0

В настоящее время я использую ниже даты парсер для разбора даты, которая передается в String:Java: Синтаксический Дата как строка, которая может или не может содержать часовой пояс информацию

public static final DateTimeParser FRACTION_PARSER = new DateTimeFormatterBuilder() 
.appendLiteral('.').appendFractionOfSecond(0, 3).toParser(); 

public static final DateTimeFormatter DATE_FORMATTER = new DateTimeFormatterBuilder() 
.appendPattern("yyyy-MM-dd'T'HH:mm:ss") 
.appendOptional(FRACTION_PARSER).appendLiteral('Z') 
.toFormatter(); 

И у меня есть ниже условия для анализа:

public static void main(String[] args) { 
    System.out.println(DATE_FORMATTER.parseDateTime("2016-01-13T13:38:19.679Z")); 
    System.out.println(DATE_FORMATTER.parseDateTime("2016-01-13T13:38:19.67Z")); 
    System.out.println(DATE_FORMATTER.parseDateTime("2016-01-13T13:38:19.6Z")); 
    System.out.println(DATE_FORMATTER.parseDateTime("2016-01-13T13:38:19Z")); 
    System.out.println(DATE_FORMATTER.parseDateTime("2016-01-15T16:58:57.649-05:00")); 
} 

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

Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "2016-01-15T16:58:57.649-05:00" is malformed at "-05:00"

Я понимаю его недостаток, поскольку я добавил в формат буквально Z. Но я ожидал, что он будет работать как парсер timeZone!

Есть ли простой способ использовать тот же парсер с дополнительным параметром для всех вышеперечисленных форматов? или мне нужно использовать разные форматы в зависимости от строки, которую я получаю?

ответ

2

.appendLiteral('Z') означает, что вы ожидаете буквы «Z» здесь, ничего больше.

Использовать appendTimeZoneOffset(String zeroOffsetText, boolean showSeparators, int minFields, int maxFields) вместо этого, чтобы ожидать смещения часового пояса.

Например: .appendTimeZoneOffset("Z", true, 2, 2) означает часовой пояс с часами и минутами или «Z» для «Зулу» (UTC).

+0

Возможно ли это? или потребуется каждый раз, чтобы иметь некоторый часовой пояс в String? –

+0

Обязательно. Если вы хотите сделать это необязательным, оберните его в другой парсер и используйте appendOptional (парсер). – pkalinow

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