2014-12-13 119 views
58

我只是試圖將日期字符串轉換爲DateTime對象在Java中8.在運行以下行:無法解析LocalDateTime(Java 8)當從TemporalAccessor獲得LocalDateTime

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); 
LocalDateTime dt = LocalDateTime.parse("20140218", formatter); 

我得到以下錯誤:

Exception in thread "main" java.time.format.DateTimeParseException: 
Text '20140218' could not be parsed: 
Unable to obtain LocalDateTime from TemporalAccessor: 
{},ISO resolved to 2014-02-18 of type java.time.format.Parsed 
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918) 
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853) 
    at java.time.LocalDateTime.parse(LocalDateTime.java:492) 

的語法是相同的東西已建議here,但我有一個例外服務。我正在使用JDK-8u25

回答

80

事實證明,Java不接受一個純粹的Date值作爲DateTime。使用LocalDate而不是LocalDateTime解決了問題:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); 
LocalDate dt = LocalDate.parse("20140218", formatter); 
+17

對於它的價值:即使使用'LocalDate'而不是'LocalDateTime',我也有同樣的問題。問題是我使用'.withResolverStyle(ResolverStyle.STRICT);'創建了'DateTimeFormatter',所以我必須使用日期模式'uuuuMMdd'而不是'yyyyMMdd'(即「year」而不是「year-of-時代」)! – ZeroOne 2016-03-22 10:44:26

+2

@ZeroOne謝謝你'uuuu'正是這個問題的答案,如果在嚴格模式下運行 – 2016-09-09 17:58:35

+0

@ZeroOne這是一個嚴格的解析器的正確答案。非常感謝! – 2017-04-10 03:12:37

21

這是一個非常不清楚且無益的錯誤消息。經過多次試驗和錯誤後,我發現LocalDateTime會出現上述錯誤,如果您不嘗試解析時間。通過使用LocalDate來代替,它可以正常工作。

這是記錄不完善,相關的例外是非常無益的。

28

如果您確實需要將日期轉換爲LocalDateTime對象,則可以使用LocalDate.atStartOfDay()。這會給你一個LocalDateTime對象在指定的日期,具有時,分,第二場設置爲0:

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); 
LocalDateTime time = LocalDateTime.from(LocalDate.parse("20140218", formatter).atStartOfDay()); 
+1

更正:設置爲*任何時間將在當天開始*。 – Trejkaz 2016-01-04 23:27:26

+12

LocalDateTime.from似乎沒有必要,因爲atStartOfDay()已經返回LocalDateTime。 – Dariusz 2016-01-11 12:56:58

+0

scala: val time = LocalDate。解析(「20171220」,DateTimeFormatter.ofPattern(「yyyyMMdd」))。atStartOfDay.format(DateTimeFormatter.ofPattern(「yyyy-MM-dd HH:mm:ss」)) – 2017-12-20 05:09:35

18

對於什麼是值得如果有人再讀這個話題(比如我),正確的答案應該在DateTimeFormatter的定義,例如:

private static DateTimeFormatter DATE_FORMAT = 
      new DateTimeFormatterBuilder().appendPattern("dd/MM/yyyy[ [HH][:mm][:ss][.SSS]]") 
      .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) 
      .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) 
      .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0) 
      .toFormatter(); 

應該設置可選字段,如果他們將出現。其餘的代碼應該完全相同。

+1

這是真正的通用解決方案,例如: Long getFileTimestamp(String file,Pattern pattern,DateTimeFormatter dtf,int group); 在這裏你有不同的模式和DateTimeFormetter,w /和w/o指定的時間。 – toootooo 2017-05-03 14:58:38

7

擴展在retrography's answer ..:我使用LocalDate而不是LocalDateTime時,甚至有同樣的問題。問題是我用.withResolverStyle(ResolverStyle.STRICT);創建了我的DateTimeFormatter,所以我不得不使用日期模式uuuuMMdd而不是yyyyMMdd(即「year」而不是「era-year」)!

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
    .parseStrict() 
    .appendPattern("uuuuMMdd") 
    .toFormatter() 
    .withResolverStyle(ResolverStyle.STRICT); 
LocalDate dt = LocalDate.parse("20140218", formatter); 

(該解決方案最初將retrography的答案評論,但我鼓勵後它作爲一個單獨的答案,因爲它顯然作品真的很好了很多人。)