2015-10-06 1 views
3

Я хотел бы разобрать '2015-10-01' с LocalDateTime. Что я должен сделать, этоLenient Java 8 синтаксический анализ

LocalDate localDate = LocalDate.parse('2015-10-01'); 
LocalDateTime localDateTime = localDateTime.of(localDate, LocalTime.MIN); 

Но я хотел бы, чтобы разобрать его в один проход, как

// throws DateTimeParseException 
LocalDateTime date = LocalDateTime.parse('2015-10-01', DateTimeFormatter.ISO_LOCAL_DATE); 

Также небольшая разница строки бросает исключение, а также.

// throws DateTimeParseException 
LocalDate localDate = LocalDate.parse("2015-9-5", DateTimeFormatter.ISO_LOCAL_DATE); 

Могу ли я подробно разбирать строки даты с помощью API Java 8 Date?

ответ

6

Если вы хотите разобрать строку даты в "2015-10-01" и "2015-9-5" к LocalDateTime объектов, вы можете построить собственный DateTimeFormatter с помощью DateTimeFormatterBuilder:

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
             .appendPattern("yyyy") 
             .appendLiteral('-') 
             .appendValue(MONTH_OF_YEAR) 
             .appendLiteral('-') 
             .appendValue(DAY_OF_MONTH) 
             .parseDefaulting(HOUR_OF_DAY, HOUR_OF_DAY.range().getMinimum()) 
             .parseDefaulting(MINUTE_OF_HOUR, MINUTE_OF_HOUR.range().getMinimum()) 
             .parseDefaulting(SECOND_OF_MINUTE, SECOND_OF_MINUTE.range().getMinimum()) 
             .parseDefaulting(NANO_OF_SECOND, NANO_OF_SECOND.range().getMinimum()) 
             .toFormatter(); 
System.out.println(LocalDateTime.parse("2015-9-5", formatter)); 
System.out.println(LocalDateTime.parse("2015-10-01", formatter)); 

переменная длина каждого поля обрабатывается вызовом appendValue(field). Цитирование Javadoc:

Парсер для значения переменной ширины, такого как обычно, ведет себя жадно, требуя одной цифры, но принимающей как можно больше цифр.

Это означает, что он сможет обрабатывать месяц и дни, отформатированные с 1 или 2 цифрами.

Чтобы построить LocalDateTime, нам также необходимо предоставить LocalTime этому строителю. Это делается с использованием parseDefaulting(field, value) для каждого поля LocalTime. Этот метод принимает поле и значение по умолчанию для этого поля, если оно отсутствует в синтаксическом анализе String. Поскольку в нашем случае информация о времени не будет присутствовать в String, будут выбраны значения по умолчанию, то есть минимальное значение для диапазона допустимых значений для этого поля (оно получается путем вызова getMinimum в ValueRange этого поля , возможно, мы могли бы также записать код 0 здесь).


В том случае, если строка для разбора может содержать информацию о времени, мы можем использовать дополнительные секции из DateTimeFormatter, как это:

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
             .appendPattern("yyyy") 
             .appendLiteral('-') 
             .appendValue(MONTH_OF_YEAR) 
             .appendLiteral('-') 
             .appendValue(DAY_OF_MONTH) 
             .appendPattern("[ HH:mm]") // optional sections are surrounded by [] 
             .parseDefaulting(HOUR_OF_DAY, HOUR_OF_DAY.range().getMinimum()) 
             .parseDefaulting(MINUTE_OF_HOUR, MINUTE_OF_HOUR.range().getMinimum()) 
             .parseDefaulting(SECOND_OF_MINUTE, SECOND_OF_MINUTE.range().getMinimum()) 
             .parseDefaulting(NANO_OF_SECOND, NANO_OF_SECOND.range().getMinimum()) 
             .toFormatter(); 
System.out.println(LocalDateTime.parse("2015-9-5", formatter)); 
System.out.println(LocalDateTime.parse("2015-10-01", formatter)); 
System.out.println(LocalDateTime.parse("2015-1-1 10:10", formatter)); 
0

дата и время Синтаксического

Чтобы создать LocalDateTime объект из строки, вы можете использовать статический метод LocalDateTime.parse(). В качестве параметра берется строка и DateTimeFormatter. DateTimeFormatter используется для указания шаблона даты/времени.

String str = "1986-04-08 12:00"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 
LocalDateTime dateTime = LocalDateTime.parse(str, formatter); 

дата и время

Форматирование Чтобы создать отформатированную строку из LocalDateTime в объект, который вы можете использовать метод() формат.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 
LocalDateTime dateTime = LocalDateTime.of(1986, Month.APRIL, 8, 12, 30); 
String formattedDateTime = dateTime.format(formatter); // "1986-04-08 12:30" 

Обратите внимание, что есть некоторые часто используемые форматы даты/времени предопределенные как константы в DateTimeFormatter. Например: Используя DateTimeFormatter.ISO_DATE_TIME для форматирования примера LocalDateTime сверху, вы получите строку «1986-04-08T12: 30: 00».

parse() и format() методы доступны для всех дат/связанных временных объектов (например, LocalDate или ZonedDateTime)

+0

Я извините, но, пожалуйста, внимательно прочитайте вопрос. Я не спрашиваю об использовании. –

0

Вы можете попробовать

private static final DateTimeFormatter formatter = 
       DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss").withResolverStyle(ResolverStyle.LENIENT); 
+0

Спасибо за ответ, но это не то, что я хотел. Для этого я должен предоставить текст в правильном формате. Это _lenient_ по-другому. –

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

  • Нет связанных вопросов^_^