[英]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”信息嗎?
無論哪種方式,這兩者都只是受過教育的猜測。 代碼應該按照書面形式工作。
檢查計算機和遠程計算機的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.