在PHP中读取xls日期

6
我正在使用php-excel-reader在我的php脚本中读取XLS文件,一切工作正常,除了读取日期之外。它只返回一个未定义的对象。
以下是需要注意的几点:
  • XLS文件不是在我的电脑上制作的,我不知道它是用哪个版本创建的。
  • 如果我在我的电脑上打开文件并重新保存,一切都可以正常工作。(但我显然更喜欢避免这样做)
  • 经过一些挖掘php-excel-reader脚本,我设法得到它从XLS中提取的值。例如,41397而不是03/05/2013(d/m/y)
以下是一些问题:
  • 这个问题能解决吗?
  • 是否可能利用41397?它是已知的日期格式吗?
  • 是否有另一个xsl到php脚本,在不改变任何内容的情况下可行?

这是由于单元格格式错误引起的。尝试在Excel中创建日期格式的日期。然后将单元格格式更改为数字,您将看到类似于41397的内容。 - user4035
是的,这正是我想的,但我需要让它能够在不手动更改单元格格式和其他内容的情况下运行。 - Simon-Okp
可以使用能够处理Excel和PHP之间日期转换的库,例如PHPExcel - 您已经标记了这个PHPExcel,但实际上并没有使用PHPExcel;或者参考https://dev59.com/z2gu5IYBdhLWcg3wpYnJ#11172688。 - Mark Baker
2个回答

14

根据 Excel 格式,41397 表示 2013-05-03

Excel 将日期和时间存储为数字,表示自 1900 年 1 月 0 日以来的天数加上一天中的小数部分:
ddddd.tttttt。这被称为序列日期或序列日期时间。

您可以使用以下代码将数字转换为有效日期:

function excelDateToDate($readDate){
    $phpexcepDate = $readDate-25569; //to offset to Unix epoch
    return strtotime("+$phpexcepDate days", mktime(0,0,0,1,1,1970));
}
php-excel-reader应该可以实现这个功能,但不知道为什么它没有做到。
您可以在此处获取有关Excel存储日期方式的更多信息:here(这不是像msdn一样正式的参考文献)。
编辑: 检查了PHPExcel,看起来静态函数PHPExcel_Shared_Date :: ExcelToPHP($ dateValue = 0,$ adjustToTimezone = FALSE,$ timezone = NULL)可以实现此操作。

谢谢,我尝试自己将其转换为有效日期,但我不知道-25569。 - Simon-Okp
-25569是为了从1900年1月0日调整到Unix纪元(1970年1月1日00:00:00 GMT),而Excel认为存在日期1900年2月29日。 - bansi

2

一种简单的方法...

<?php $date = date_create('30-12-1899'); date_add($date, date_interval_create_from_date_string('41397 days')); echo date_format($date, 'Y-m-d'); ?>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接