2017-06-01 17 views
2

我試圖轉換OffsetDateTime中的字符串,但得到的錯誤率低於此值。將字符串轉換爲Java中的OffsetDateTime

java.time.format.DateTimeParseException: Text '20150101' could not be parsed: Unable to obtain OffsetDateTime from TemporalAccessor: {},ISO resolved to 2015-01-01 of type java.time.format.Parsed

代碼:OffsetDateTime.parse("20150101", DateTimeFormatter.ofPattern("yyyyMMdd"));

預期輸出:OffsetDateTime object with date 20150101.

我真的很感激任何幫助,您可以提供。

感謝,

+0

你的字符串日期是在比圖案不同的格式。你不應該使用「yyyyMMdd」格式嗎? – tsolakp

+0

對不起,錯誤更新了我的問題。我只傳遞「yyyyMMdd」,但得到提及錯誤。 –

+0

我認爲你的日期和格式化程序也必須指定這樣的偏移量:2007-12-03T10:15:30 + 01:00。查看+符號後的部分。 – tsolakp

回答

5

OffsetDateTime表示具有偏移量的日期 - 時間,例如,

2007-12-03T10:15:30 + 01:00

你正在試圖解析不符合的OffsetDateTime. 要求全文見第https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html

的字符爲parsed既不包含ZoneOffset也不包含時間。從格式化程序的字符串和模式看來,您只需要一個LocalDate。所以,你可以使用:

LocalDate.parse("20150101", DateTimeFormatter.ofPattern("yyyyMMdd")); 
2

,只要你想來解析日期使用的LOCALDATE代替offsetDatetime對你的情況(沒有時間/偏移)。 offsetDatetime的使用已經很好地討論了here

+2

然後,您可以使用atStartOfDay()。atOffset(yourDesiredOffset)轉換爲OffsetDateTime。偏移可以是例如'ZoneOffset.UTC'。日期和時間類通常強迫你明確你想要什麼,而不是給你可能不符合你需要的默認值,這是一件好事。 –

0

謝謝大家的回覆。 早些時候我使用joda datetime(查看下面的方法)來處理日期和日期時間,但我想使用Java8庫而不是外部庫。

static public DateTime convertStringInDateFormat(String date, String dateFormat){ 
    DateTimeFormatter formatter = DateTimeFormat.forPattern(dateFormat); 
return formatter.parseDateTime(date); 
} 

我期待同用OffsetDateTime,但一定要知道,我們可以使用ZonedDateTime或OffsetDateTime如果我們想在某個時間段的日期/時間來工作。 由於我正在致力於LocalDate可以提供幫助的期限和持續時間。

字符串爲DateTime:

LocalDate date = 
LocalDate.parse("20150101", DateTimeFormatter.ofPattern("yyyyMMdd")); 

到LOCALDATE所需的字符串格式:

String dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"; 
date.atStartOfDay().format(DateTimeFormatter.ofPattern(dateFormat)); 
+1

正確理解。提示:在最後一行,我建議**總是將明確的'ZoneId'傳遞給'atStartOfDay' **調用。例如:'.atStartOfDay(ZoneId.of(「Africa/Lagos」))'否則你隱式地獲取JVM的當前默認時區。最好明確你想要的/預期的時區。並且,該默認值可以在運行時由JVM中的任何代碼隨時更改,因此缺省值不可靠。例如,考慮到你在你的問題中提出的問題,你將得到芝加哥一天的開始,而不是拉各斯日的開始。 –

+0

另一個需要注意的地方是'LocalDate'是'Period',因爲這個類代表了一個時間跨度,粒度爲幾年,幾個月,幾天。但是「持續時間」是指秒數加上幾分之一秒(納秒)的時間跨度。因此,「持續時間」適用於日期時間值,例如「即時」,「OffsetDateTime」和「ZonedDateTime」,而不是僅限於日期的「LocalDate」。 –