在Java Date / Calendar对象中找到的神秘毫秒数

时间:2012-11-13 09:07:42

标签: java date calendar

使用DateCalendar时有一种奇怪的怪异。要点我想创建一个特定的日期,例如

Calendar cal = Calendar.getInstance();
cal.set(1970, 0, 1, 0, 0, 0);
Date date = cal.getTime(); 

现在的问题是:它显示了正确的日期,但是在调试时我在日期变量下看到例如“快速时间”。 -3599459。这使我的JUnit测试失败,因为预期值为-3600000。 似乎日历增加了541毫秒或类似于初始化时的内容......

问题是:是不是可以简单地创建一个固定日期而不是'我在后台'鬼功能中添加几毫秒?

6 个答案:

答案 0 :(得分:12)

来自您正在调用的set方法的文档:

  

设置字段YEAR,MONTH,DAY_OF_MONTH,HOUR,MINUTE和SECOND的值。保留其他字段的先前值。如果不需要,请先调用clear()。

所以它保留了毫秒值。它不是添加几毫秒 - 当你调用getInstance时,它会花费系统时间,因为它有记录要做。

首先调用clear(),或明确设置毫秒值。 (我个人使用clear()。我还明确设置了时区,只是为了让你更清楚你期待的时间。

或者,使用Joda Time开始 - 这是很多更令人愉快的日期/时间API。

答案 1 :(得分:7)

在致电cal.getTime()之前添加此行:

cal.set(Calendar.MILLISECOND, 0);

这将确保您将毫秒设置为零。

答案 2 :(得分:0)

一个常用的最佳做法是引入Clock对象来包装对Date / Time API的所有访问权。

基本上,您有两个实现 - 一个SystemTimeClock,它将所有内容转发到您选择的日期/时间提供程序,以及一个用于测试的模拟实现。

这样,您的代码就会独立于API的细节,并且您的测试可以顺利进行。

答案 3 :(得分:0)

在使用日期时,我对图书馆Joda Time非常满意。我知道这不是你问题的答案,但也许值得研究:http://joda-time.sourceforge.net/ JavaDocs:http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html

答案 4 :(得分:0)

问题是“set”不设置“毫秒”值,因此毫秒值仍然是使用getInstance创建日历时的值。你可以打电话

cal.set(Calendar.MILLISECOND, 0);

在调用getTime之前,这将确保毫秒为0.您还可以直接创建格里高利历:

Calendar cal = new GregorianCalendar(1970, 0, 1, 0, 0, 0);
assertEquals(0, cal.get(Calendar.MILLISECOND));

如果您想要更完整地实现日历和时间功能,可以使用Joda Time而不是标准Java Calendar API。

答案 5 :(得分:-1)

Calendar cal = Calendar.getInstance(); 
cal.setTime(new Date());