使用Date
和Calendar
时有一种奇怪的怪异。要点我想创建一个特定的日期,例如
Calendar cal = Calendar.getInstance();
cal.set(1970, 0, 1, 0, 0, 0);
Date date = cal.getTime();
现在的问题是:它显示了正确的日期,但是在调试时我在日期变量下看到例如“快速时间”。 -3599459
。这使我的JUnit
测试失败,因为预期值为-3600000
。
似乎日历增加了541毫秒或类似于初始化时的内容......
问题是:是不是可以简单地创建一个固定日期而不是'我在后台'鬼功能中添加几毫秒?
答案 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());