[英]SimpleDateFormat showing inconsistent results
val dateStr = "2020 10 12 23 12 13"
val dateFormat = "yyyyMMddHHmmss"
import java.util.Date
val sdf = new SimpleDateFormat(dateFormat)
sdf.setLenient(false)
val res = sdf.parse(dateStr)
println("res = "+res)
scala> val res = sdf.parse(dateStr)
java.text.ParseException: Unparseable date: "2020 10 12 23 12 13"
at java.text.DateFormat.parse(DateFormat.java:366)
... 50 elided
上面的代碼塊解析並導致異常,但是如果我將“MM”部分更改為“11”而不是“10”,那么它解析得很好,沒有任何異常,但是日期錯誤。 知道為什么嗎? 如果我的日期字符串不是這種格式“yyyyMMddHHmmss”,我希望代碼失敗或拋出異常
/*Note the 11 instead of 10*/
val dateStr = "2020 11 12 23 12 13"
val dateFormat = "yyyyMMddHHmmss"
import java.util.Date
val sdf = new SimpleDateFormat(dateFormat)
sdf.setLenient(false)
val res = sdf.parse(dateStr)
println("res = "+res)
scala> val res = sdf.parse(dateStr)
res: java.util.Date = Wed Jan 01 01:02:23 PST 2020
Ruokki 的答案是正確的,您的格式模式與您的輸入數據不匹配。
更重要的是,您使用了錯誤的類。 與 Java 的最早版本捆綁在一起的日期時間類非常糟糕。 它們在幾年前被 JSR 310 中定義的現代java.time類所取代。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu MM dd HH mm ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
要檢測錯誤輸入,請捕獲DateTimeParseException
。
try
{
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
}
catch ( DateTimeParseException e )
{
…
}
ResolverStyle
DateTimeFormatter
在解析中使用三種不同方法之一:嚴格、智能和寬松。 這些由ResolverStyle
枚舉表示。 默認情況下使用SMART
,但如果更適合您的需要,您可以指定STRICT
。
我建議您對您的輸入數據的發布者進行有關ISO 8601的教育。 該標准定義了以文本方式交換日期時間值的格式。
java.time類在解析/生成字符串時默認使用ISO 8601格式。 因此無需為兼容輸入定義格式模式。
SimpleDateFormat 對您想要的東西太寬松了。 它將您的日期解析為:
2020 yyyy
_1 MM (where _ represents a space)
1 dd
_1 HH
2 mm
23 seconds
12 13 ignored
所以我認為對你來說最好的解決方法是咬緊牙關並禁止空格。
所以嘗試修剪字符串然后在中間搜索空格。 如果找到空格,則拋出異常。
但最終最好放棄 SimpleDateFormat 並使用新的東西。 我認為新的 DateTimeFormatter class 會更好地為您服務:
// In Java
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
LocalDateTime date = LocalDateTime.parse(dateStr, formatter);
System.out.println("date="+date);
這會拋出異常。
在 Scala 中:
val formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
val date = LocalDateTime.parse(dateStr, formatter);
println("date="+date);
您好,我認為問題是日期格式:
val dateFormat = "yyyyMMddHHmmss"
並且應該是
val dateFormat = "yyyy MM dd HH mm ss"
因為您的 dateStr 包含一些在格式中起重要作用的空間
但是,如果您想失敗,以防您在日期中有空間或其他不需要的東西,那么正則表達式可能是最好的答案?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.