簡體   English   中英

SimpleDateFormat 顯示不一致的結果

[英]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.time

更重要的是,您使用了錯誤的類。 與 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

我建議您對您的輸入數據的發布者進行有關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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM