簡體   English   中英

為什么我從SimpleDateFormat收到錯誤“無法解析的日期”?

[英]Why am i getting the error “Unparseable date” from SimpleDateFormat?

我試圖將不帶時區的日期字符串解析為具有時區的新日期,但我收到錯誤:
java.text.ParseException: Unparseable date: "2017-11-17 10:49:39.772 "

這是我的代碼:

 String date = "2017-11-17 10:49:39.772 "
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z");
 sdf.setTimeZone(TimeZone.getTimeZone("Europe/Amsterdam"));
 sdf.parse(date);  //here´s the error
 return date.getTime();

有什么建議么?

您的問題已經回答。 我只是想貢獻您的代碼的現代版本。

java.time

您正在使用過時的類SimpleDateFormatDate java.time ,現代Java日期和時間API(也稱為JSR-310)通常更好用。 在您的特定情況下,代碼非常相似:

    String date = "2017-11-17 10:49:39.772 ";
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS ");
    ZoneId zid = ZoneId.of("Europe/Amsterdam");
    ZonedDateTime zdt = LocalDateTime.parse(date, dtf).atZone(zid);
    System.out.println(zdt);

此打印

2017-11-17T10:49:39.772+01:00[Europe/Amsterdam]

我不必重復@DarrenW已經說過的內容:當您的輸入字符串以空格結尾且沒有時間偏移時,那么您的格式模式字符串也應該以空格結尾且沒有Z因為Z與UTC的偏移匹配(現在無論如何我都重復了它)。

Date相反, ZonedDateTime有一個時區(顧名思義),因此我認為這可能更適合您的要求。

從紀元獲取毫秒

可能是推測:您的調用date.getTime()給我的印象是您距格林尼治標准時間1970年1月1日00:00:00(“紀元”)以來的毫秒數。 如果是這樣,請執行以下操作:

    long millisSinceEpoch = zdt.toInstant().toEpochMilli();

結果是

1510912179772

用字符串中最遠的時區進行解析

更多的猜測是,我不禁會想, 可能是您收到了一個與格式模式字符串匹配的日期時間字符串,但是輸入了不正確的時區偏移量,您將其剝離了,從而在其中留下了懸空的空間。字符串的結尾。 如果是這種情況,現代API只需在解析時忽略不正確的偏移量,就可以更輕松,更優雅地處理這種情況:

    String date = "2017-11-17 10:49:39.772 +0000";
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS Z");
    ZoneId zid = ZoneId.of("Europe/Amsterdam");
    ZonedDateTime zdt = LocalDateTime.parse(date, dtf).atZone(zid);

結果2017-11-17T10:49:39.772+01:00[Europe/Amsterdam]2017-11-17T10:49:39.772+01:00[Europe/Amsterdam] ,與上面的第一個代碼段完全相同。 LocalDateTime是沒有任何時區或偏移量信息的日期和時間,因此,無法通過字符串獲得不正確的偏移量。 無論如何, atZone()仍設置正確的時區。

獲得相同結果的另一種方法是將其解析為ZonedDateDate ,然后調用其withZoneSameLocal()來擺脫不需要的偏移量。

您在SimpleDateFormat中明確表示要在末尾需要時區偏移量( Z參數),但是字符串缺少該偏移量。 您最終需要+0000這樣的東西。

如果要正確解析字符串,則它必須與構造函數中提供的SimpleDateFormat模式匹配:

舊線:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z");

新隊:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS ");

暫無
暫無

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

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