需要从POI到Date字符串的转移号码字符串

时间:2015-04-30 18:44:48

标签: java date apache-poi

通过使用POI,我得到了字符串数字格式的日期。 例如:对于日期“10/15/2012”,我将“41197”作为字符串。 但我需要的是“10/15/2012”作为字符串。 我是否可以使用任何现有方法进行从“41197”到“10/15/2012”的转换。

2 个答案:

答案 0 :(得分:1)

自纪元以来的天数

该数字似乎是epoch以来的天数。但哪个时代?

POI是用于处理Microsoft Office文档的库。不幸的是,不同的Microsoft产品团队使用了不同的时代。

  • January 0, 1900 Microsoft Excel
  • January 1, 1904 Microsoft Excel
  • January 1, 1 Microsoft .Net
  • December 30, 1899 Microsoft COM

为了进一步混淆事情,Apache POI的文档DateUtil absoluteDay讨论了1900/12/31

请注意,Microsoft Excel会观察1900年2月29日的虚构日期。

探索DateUtil类,了解Excel编号,Java Date和字符串之间的转换方法。

实验

以下是一些使用Joda-Time 2.7库来试验不同时期的代码,因此我们可能会猜测哪个时期符合您的预期结果。

尝试这3个时代。

LocalDate epoch_1900_01_00 = new LocalDate( 1900, 1, 1 ).minusDays(1);
LocalDate epoch_1904_01_01 = new LocalDate( 1904, 1, 1 );
LocalDate epoch_1900_12_31 = new LocalDate( 1900, 12, 31 );

int countDays  = 41197;

计算结果。

System.out.println (epoch_1900_01_00 + " + " + countDays + " days = " + epoch_1900_01_00.plusDays ( countDays ) );
System.out.println (epoch_1904_01_01 + " + " + countDays + " days = " + epoch_1904_01_01.plusDays ( countDays ) );
System.out.println (epoch_1900_12_31 + " + " + countDays + " days = " + epoch_1900_12_31.plusDays ( countDays ) );

跑步时。

1899-12-31 + 41197 days = 2012-10-16
1904-01-01 + 41197 days = 2016-10-16
1900-12-31 + 41197 days = 2013-10-16

如果我们为虚构的闰日减去一个,那么1899-12-31(或January 0, 1900)的第一个时期会使您的预期值达到2012-10-15。

答案 1 :(得分:0)

如果您的单元格返回数字数据,则可以按日期转换它们

试试这个

if(cell.getCellType()==Cell.CELL_TYPE_NUMERIC){
    if (DateUtil.isCellDateFormatted(cell)) {
        System.out.println(cell.getDateCellValue());
    } else {
        System.out.println(cell.getNumericCellValue());
    }
}