【发布时间】:2010-06-03 15:52:24
【问题描述】:
我一直在调试一些现有代码,这些代码在我的系统上单元测试失败,但在同事的系统上却没有。根本原因是 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) 是该测试模拟的生产代码中使用的,所以我不想更改它。
【问题讨论】:
-
我不确定,但您也可以查看 TimeZone 吗?我觉得TimeZone可以基于系统吧?
-
我已在原始帖子中更新了我的测试类和堆栈跟踪,以删除与我发现错误的应用程序相关的命名。代码已从我的编辑器复制并粘贴到浏览器;唯一的编辑是按照 Stack Overflow 的要求将代码缩进四个空格。堆栈跟踪也是如此,尽管我删除了测试运行工具中调用的堆栈跟踪行。如果您想查看它们,我可以添加它们。
-
您使用什么版本的 JDK 来编译以及您在什么版本的 JRE 上运行这些。这很可能是问题所在。
-
@Fuzzy 我不这么认为。
format.parse(format.format(new Date()))怎么可能在运行的 JRE 中抛出 ParseException? -
我正在使用 Rational Application Developer 7 来编译和运行测试。我正在开发的项目针对 WebSphere 6.1,因此我在与之关联的 IBM JRE 中运行测试:IBM J9 VM(构建 2.3,J2RE 1.5.0 IBM J9 2.3 Windows XP x86-32 j9vmwi3223-20060504(启用 JIT) . 这是团队其他人用来运行相同测试的同一个 JRE,并且在其他机器上测试成功。我只是尝试使用 Sun Java 6 JRE (1.6.0_20) 运行测试,然后测试运行成功。我不知道该怎么做。
标签: java simpledateformat