2017-08-15 54 views
0

我有一個字符串和一個格式。我想使用該格式將字符串轉換爲日期時間。但簡單的日期時間格式將字符串轉換爲日期時間,即使輸入字符串格式不正確。日期時間解析不執行格式

val formatter = new SimpleDateFormat("yyyyMMdd") 
val dateInString = "2017042er7" 

try { 
formatter.setLenient(false) 
val date = formatter.parse(dateInString) 
System.out.println(date) 
System.out.println(formatter.format(date)); 

} catch { 

case e:Exception=>println(e) 
} 

我該如何執行格式?

** UPDATE :: **使用joda時間格式化程序解決了這個問題。您也可以使用java時間格式化程序(作爲建議的答案之一)。

+1

僅供參考,諸如'java.util.Date',['java.util.Calendar'](https://docs.oracle.com)之類的麻煩的舊日期時間類.com/javase/8/docs/api/java/util/Calendar.html)和'java.text.SimpleTextFormat'現在是[legacy](https://en.wikipedia.org/wiki/Legacy_system),代替通過[java.time](https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html)類。同樣,[Joda-Time](http://www.joda.org/joda-time/)項目現在處於[維護模式](https://en.wikipedia.org/wiki/Maintenance_mode),其中團隊建議遷移到java.time類。 –

回答

2

您應該使用新的API java.time及其DateTimeFormatter解析您的日期。它允許更好的控制和正確性,並且對格式更嚴格。

將舊的java.util.DateSimpleDateFormatter保留下來,只是在需要它與庫進行交互時將它們轉換爲它們。

+0

使用喬達時間也解決了這個問題。 – Luniam

+2

@Luniam是的,但實際上應該放棄使用新的java.time的jodatime,以及java.time是java 8之後的jodatime的繼承者。 – puhlen

0

setLenient並不關心字符串格式,而是傳遞的值可以轉換爲日期。例如,應將31-Sept-2017視爲01-Aug-2017

這個庫試圖通過解析你的輸入來幫助你(dd是一個數字,所以2滿足要求,之後的所有內容都可以忽略)。如果您需要的格式爲String,那麼在轉換輸入之前,您應該使用正則表達式來驗證輸入。

順便說一句,我不一定與實施同意,只是試圖解釋爲什麼它的工作原理:)

+0

它不應該完全按照格式進行解析。否則,提供格式有什麼意義。當我期待別的事情時,我得到一個錯誤的價值。我會說這是一個糟糕的實現。喬達時間更好。使用約達時間解決了我遇到的問題。 – Luniam

+0

我不反對,只是解釋你爲什麼看到你的結果。 – StuPointerException

0

TL;博士

LocalDate.parse(        // Use modern java.time classes. 
    "2017042er7".replaceAll("\\D+" , "") , // Extract digits from string. 
    DateTimeFormatter.BASIC_ISO_DATE   // Use pre-defined formatter for YYYYMMDD input, the 「basic」 version of standard ISO 8601 format. 
).toString()         // Generate String in full version of ISO 8601 format (with hyphens as separators). 

2017年4月27日

提取數字

Extract digits from a string in Java解釋的那樣,只從一個字符串中提取數字。

String original = "2017042er7" ; 
String input = original.replaceAll("\\D+" , "") ; 

解析爲LocalDate

避免在看到問題的麻煩舊的遺留日期時間類。由java.time類提供。

LocalDate類代表沒有時間和不帶時區的僅有日期的值。

DateTimeFormatter類包含一個預定義的格式模式以滿足您的需求:BASIC_ISO_DATE。這是標準ISO 8601格式的「基本」版本(儘量減少使用分隔符)。

LocalDate ld = LocalDate.parse(input , DateTimeFormatter.BASIC_ISO_DATE) ; 

看到這個code run live in IdeOne.com

原:2017042er7

LD。toString():2017-04-27