Apache POI:在实际的电子表格中,设置日期有时会出错

时间:2016-08-27 12:35:23

标签: apache-poi

这个错误一直让我发疯。我基本上处理大量数据,部分代码在某些日期读取并将它们输出到新的电子表格中。我注意到一个非常不一致的差异,有时候,有时只有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);

再次感谢!

1 个答案:

答案 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,其中包含给定的日期和时间。