13

使用Dates 和Calendar. 重点是我想创建一个特定的日期,例如

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

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

问题是:如果没有这个“我在后台添加一些毫秒”-ghost 函数,就不可能简单地创建一个固定日期吗?

4

6 回答 6

12

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

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

所以它保留了毫秒值。它不会增加几毫秒 - 它会在您调用时占用系统时间getInstance,因为它已记录在案。

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

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

于 2012-11-13T09:11:40.887 回答
7

在调用之前添加此行cal.getTime()

cal.set(Calendar.MILLISECOND, 0);

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

于 2012-11-13T09:11:01.703 回答
0

一个常用的最佳实践是引入一个Clock对象来包装对日期/时间 API 的所有访问。

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

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

于 2012-11-13T09:13:26.600 回答
0

在处理日期时,我对 Joda Time 库非常满意。我知道这不完全是您问题的答案,但也许值得研究:http: //joda-time.sourceforge.net/ JavaDocs:http: //joda-time.sourceforge.net/apidocs/org/joda /time/DateTime.html

于 2012-11-13T09:16:19.583 回答
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。

于 2012-11-13T09:17:14.343 回答
-1
Calendar cal = Calendar.getInstance(); 
cal.setTime(new Date());
于 2014-11-17T12:07:47.923 回答