这个错误一直让我发疯。我基本上处理大量数据,部分代码在某些日期读取并将它们输出到新的电子表格中。我注意到一个非常不一致的差异,有时候,有时只有1秒钟会被添加到每个日期单元格中。如果我再次运行我的程序,它将被修复。这毫无意义。
作为测试,我会在输出实际文件(来自输出XSSFWorkbook文件)之前将一些日期值打印到控制台,并且它们仍然是正确的。然后我打开电子表格,他们就错了;超级奇怪。
我尝试了多种解决方案,例如将日期作为字符串读取并将其转换回来,将所有已弃用的日期值更改为日历,但是在我的程序之后出现了问题,可能是如何读取数据?我在网上找到的唯一类似案例就是这里提到的那样:
POI Java Date to Excel seconds difference
..但没有发布解决方案,我也不确定如何使用epoch diff util。我的代码太大了,无法分享,我不认为问题出现在我的代码中,但如果需要的话,我可以分享一些东西,如果有帮助的话,甚至会尝试将它分离成一个小样本。
任何帮助都会很棒!谢谢!
解决!
惊人。感谢Axel Richter'解决方案,我解决了。我甚至没想过毫秒有影响;谢天谢地,我的数据并不关心它,所以将它们设置为0解决了这个问题!
如果我错了,请原谅我,但我认为上面提到的calender.set并不需要考虑毫秒(它可能是年,月,日,小时,分钟,秒)。我没有看到任何方法接受另一个参数毫秒,所以我只是解决了这个问题:
cal.set(y, m, d, h, mi, s);
cal.set(Calendar.MILLISECOND, 0);
再次感谢!
答案 0 :(得分:2)
即使这个问题没有具体的例子,我也有怀疑。
如果我们正在使用:
Calendar calendar = Calendar.getInstance();
然后根据Searching for value of any field in MongoDB without explicitly naming it
" Calendar的getInstance方法返回一个Calendar对象 日历字段已使用当前日期和时间进行初始化。"
所以在此之后我们将在日历中显示当前的timemillis。
如果我们这样做:
calendar.set(2016, 7, 28, 9, 17, 0);
我们设置了年,月,日,小时,分钟和秒。但我们不设置毫秒。因此,毫秒将保持为Calendar.getInstance()
随机的毫秒数。如果它们随机大于500毫秒,我们就会有一秒的差异。
所以我们应该这样做:
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(2016, 7, 28, 9, 17, 0);
这是:创建一个Calendar
实例,其中包含当前日期时间(包括毫秒)。然后clear
日历。所以我们可以肯定,毫秒是未定义的。然后set
所需的日期时间。
也可以使用
GregorianCalendar calendar = new GregorianCalendar(2016, 7, 28, 9, 17, 0);
因为这个构造函数将返回一个GregorianCalendar
,其中包含给定的日期和时间。