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



这个bug快把我逼疯了。我基本上处理大量数据,我的一部分代码读取一些日期并将它们输出到一个新的电子表格中。我注意到一个非常不一致的差异,有时,只是有时,1秒将添加到每个日期单元格。如果我再次运行我的程序,它就会被修复。这没有意义。

作为测试,在输出实际文件(来自输出XSSFWorkbook文件)之前,我将一些日期值打印到控制台,它们仍然是正确的。然后我打开电子表格,结果是错的;超级奇怪。

我尝试过多种解决方案,如读取日期作为字符串并将其转换回来,将所有弃用的日期值更改为日历,但在我的程序之后有些东西会中断,也许数据是如何读取的?我在网上找到的唯一一个类似的例子是这里,它被提到了:

Java日期与Excel秒差

. .但没有解决方案张贴,我不确定我将如何使用epoch困难的东西。我的代码太大了,不能分享,我不认为问题出在我的代码上,但如果需要,我可以分享一些东西,甚至尝试将其隔离到一个小样本中,如果这有帮助的话。

任何帮助将是伟大的!谢谢!

解决!

神奇。多亏了Axel Richter的解决方案,我解决了这个问题。我从来没有想过毫秒的影响;谢天谢地,我的数据不关心它,所以将它们设置为0解决了这个问题!

如果我错了请原谅,但我认为日历。上面的Set suggest不考虑毫秒(它可能是年、月、日、时、分、秒)。我没有看到任何方法以毫秒为单位接受另一个参数,所以我只是像这样解决这个问题:

cal.set(y, m, d, h, mi, s);
cal.set(Calendar.MILLISECOND, 0);

再次感谢!

即使这个问题没有具体的例子,我也有一种怀疑。

如果使用:

  Calendar calendar = Calendar.getInstance();

然后根据文档

"Calendar的getInstance方法返回一个Calendar对象日历字段已经用当前日期和时间初始化。"

在此之后,我们有了日历中的当前时间millis。

如果我们这样做:

  calendar.set(2016, 7, 28, 9, 17, 0);

我们已经设置了年、月、日、时、分和秒。但是我们有而不是设置毫秒。所以毫秒数将保持在Calendar.getInstance()上的随机值。如果它们随机大于500毫秒,我们就有1秒的差异。

所以我们应该这样做:

  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

最新更新