簡體   English   中英

在我的程序中,在執行SimpleDateFormat.parse時間歇性地獲取ParseException

[英]In my program am getting intermittently ParseException while doing SimpleDateFormat.parse

在我的程序中,執行SimpleDateFormat.parse時間歇性地獲取ParseException

我寫了一個Apache風暴螺栓,因為我正在解析輸入日期"2018-02-26 18:13:32 UTC"

並非在每個輸入日期都拋出此異常。 另外,我已經在錯誤日志中打印了輸入日期。 在視覺上,輸入日期格式沒有問題。

但是我有用於間歇輸入的ParseException

我懷疑是因為它是並發環境。

以下是代碼段:

utcDateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss 'UTC'");

我懷疑是因為它是並發環境。

實際上,這是最可能的原因,因為SimpleDateFormat不是線程安全的。 在此處檢查問題分析以及如何解決問題: https//www.javaspecialists.eu/archive/Issue172.html

除此之外,“ UTC”是重要信息(它表示日期以UTC為單位),因此您不能將其視為文字(在引號內)。 您創建的格式化程序會忽略日期為UTC(因為在引號內將其視為“某些文本” ,而不是“在UTC中” ),因此它實際上是使用JVM默認時區(不一定是UTC) 。

要正確解析UTC ,必須使用z模式:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
Date date = sdf.parse("2018-02-26 18:13:32 UTC");

但是,如果您使用的是Java 8或更高版本,則只需使用新的date API:

DateTimeFormatter fmt = new DateTimeFormatterBuilder()
    // parse date and time
    .appendPattern("yyyy-MM-dd HH:mm:ss ")
    // parse UTC
    .appendOffset("+HH:MM", "UTC")
    // create the formatter
    .toFormatter();
OffsetDateTime odt = OffsetDateTime.parse("2018-02-26 18:13:32 UTC", fmt);

乍一看似乎比較復雜,但是這個新的API提供了許多不同的日期時間類型以及更多的選項來解析和格式化它們。

更重要的是: 它是線程安全的

更新:

如評論中所建議,您還可以執行以下操作:

DateTimeFormatter fmt  = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss zzz");
ZonedDateTime zdt = ZonedDateTime.parse("2018-02-26 18:13:32 UTC", fmt);

如果仍然需要使用java.util.Date ,則很容易進行轉換:

Date javaUtilDate = Date.from(zdt.toInstant());

OffsetDateTime類還具有toInstant()方法,因此兩者都可以轉換為Date

SimpleDateFormat不是線程安全的,您實際上可以在並發環境中獲得ParseException

有關詳細信息,請參見此處

對於Java 8,可以使用線程安全的DateTimeFormatter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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