簡體   English   中英

為什么在使用SimpleDateFormat格式化日期然后解析它時會出現ParseException?

[英]Why am I getting a ParseException when using SimpleDateFormat to format a date and then parse it?

我一直在調試一些現有的代碼,我的系統上的單元測試失敗了,但同事的系統卻沒有。 根本原因是SimpleDateFormat在解析應該可解析的日期時拋出ParseExceptions。 我創建了一個單元測試,演示了我的系統失敗的代碼:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

import junit.framework.TestCase;

public class FormatsTest extends TestCase {

    public void testParse() throws ParseException {
        DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss.SSS Z");
        formatter.setTimeZone(TimeZone.getDefault());
        formatter.setLenient(false);

        formatter.parse(formatter.format(new Date()));
    }
}

此測試在我的系統上拋出ParseException,但在其他系統上成功運行。

java.text.ParseException: Unparseable date: "20100603100243.118 -0600"
    at java.text.DateFormat.parse(DateFormat.java:352)
    at FormatsTest.testParse(FormatsTest.java:16)

我發現我可以setLenient(true) ,測試會成功。 setLenient(false)是此測試模擬的生產代碼中使用的內容,因此我不想更改它。

---在響應后編輯,表明開發人員正在使用IBM的J9 1.5.0 Java虛擬機---

IBM的J9 JVM似乎在DateFormat的解析例程中存在一些錯誤和不兼容性,SimpleDateFormat可能會繼承它,因為它是DateFormat的子類。 有些證據支持IBM的J9功能不如預期的那樣,其他JVM(如Sun的HotSpot JVM)可以在這里看到。

請注意,這些錯誤和不兼容性在J9 JVM中甚至不一致,換句話說,IBM J9格式化邏輯實際上可能生成與IBM J9解析邏輯不兼容的格式化時間。

似乎與IBM的J9 JVM綁定的人傾向於通過不使用DateFormat.parse(...)(或SimpleDateFormat.parse(...))解決JVM中的錯誤。 相反,他們傾向於使用java.util.regex.Matcher手動解析字段。

也許后來發布的J9 JVM修復了這個問題,也許不是。

---原帖如下---

有趣,相同的代碼修改為:

import java.util.Date;
import java.util.TimeZone;
import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.text.ParseException;

public class FormatsTest {

 public void testParse() throws ParseException {
  DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss.SSS Z");
  formatter.setTimeZone(TimeZone.getDefault());
  formatter.setLenient(false);
  System.out.println(formatter.format(new Date()));

  formatter.parse(formatter.format(new Date()));
 }

 public static void main(String[] args) throws Exception {
   FormatsTest test = new FormatsTest();
   test.testParse();
 }

}

我的系統運行正常。 我敢打賭,這是你環境中的事情。 您要么在一個JVM主要版本上編譯代碼並在另一個JVM主要版本上運行它(這可能會導致一些問題,因為庫可能已過期),或者您運行它的系統可能會奇怪地報告時區信息。

最后,您可能想要考慮是否使用了JVM的早期版本。 有時bug會進入各種版本,並且它們會在以后的版本中修復。 你可以修改你的問題,為你的系統包含“java -version”信息嗎?

無論哪種方式,這兩者都只是受過教育的猜測。 代碼應該按照書面形式工作。

這應該是IBM的J9 VM中關於SimpleDateFormat類的錯誤。

這篇文章顯示了一個類似的問題,並說它應該在v6上修復。

您可以在此處找到多個版本的更改列表。

我看到有一個與DateFormat相關的數字。 因此,您可能應該向IBM提出錯誤報告或其他內容,以便為您提供補丁。

檢查計算機和遠程計算機的LANG環境變量。

根據語言環境解析日期,因此只有當LANG設置為english時,'Jul'才能用作7月,否則會引發ParseException。

您可以通過運行export LANG="en_US.UTF-8"然后運行程序來進行快速測試。

您還可以使用以下方法以編程方式設置語言環境: DateFormat.getDateInstance(int,java.util.Locale)

暫無
暫無

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

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