2015-11-09 5 views
3

Я пытаюсь проанализировать следующую строку timestamp 03-feb-2014 13:16:31 с помощью java.time, но это ошибка. Вот мой код.Java8 LocalDateTime parsing error

String timestamp = "03-feb-2014 13:16:31"; 

DateTimeFormatter format; 
DateTimeFormatterBuilder formatBuilder = new DateTimeFormatterBuilder(); 
formatBuilder.parseCaseInsensitive(); 
formatBuilder.append(DateTimeFormatter.ofPattern("dd-MMM-YYYY HH:mm:ss")); 
format = formatBuilder.toFormatter(); 

LocalDateTime localdatetime = LocalDateTime.parse(timestamp, format); 

Но я получаю следующее сообщение об ошибке.

Exception in thread "main" java.time.format.DateTimeParseException: Text '03-feb-2014 13:16:31' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {DayOfMonth=3, MonthOfYear=2, WeekBasedYear[WeekFields[SUNDAY,1]]=2014},ISO resolved to 13:16:31 of type java.time.format.Parsed 
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920) 
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855) 
    at java.time.LocalDateTime.parse(LocalDateTime.java:492) 
    at com.target.util.CntrlmProcessor.main(CntrlmProcessor.java:24) 
Caused by: java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: {DayOfMonth=3, MonthOfYear=2, WeekBasedYear[WeekFields[SUNDAY,1]]=2014},ISO resolved to 13:16:31 of type java.time.format.Parsed 
    at java.time.LocalDateTime.from(LocalDateTime.java:461) 
    at java.time.format.Parsed.query(Parsed.java:226) 
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) 

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

Я попытался разобрать только временную часть временной метки, и это работает нормально.

ответ

11

Если вы используете yyyy вместо YYYY в своем шаблоне, код, который вы дали, работает. YYYY - это «недельный год», который обычно используется только в том случае, если вы также указываете номер недели и день недели (например, шаблон YYYY-ww-EEE). Это довольно редко.

Обратите внимание, что даже просто «год» имеет yyyy и uuuu - yyyy это «год эры» (всегда неотрицательное - и всегда положителен в григорианском календаре), тогда как uuuu является своего рода «eraless года», - например, 5BCE составляет -4 года. Если вам не нужно заниматься датами до общей эры (или датами в других системах календаря), вам, вероятно, не нужно беспокоиться об этом.

Я хотел бы также предложить переписывать код, как:

DateTimeFormatter format = new DateTimeFormatterBuilder() 
    .parseCaseInsensitive() 
    .appendPattern("dd-MMM-yyyy HH:mm:ss") 
    .toFormatter(); 

... только для простоты.

+0

это отличное объяснение! Кроме того, я включил ваше предложение. :) – mahacoder