2

如何使用 phpexcel 和代码点火器将此 excel 数据序列值转换41225回日期格式?12-Nov-2012

我尝试了以下方法,但没有奏效。

$G74 = $objPHPExcel->getActiveSheet()->getCell('B6')->getValue();
4

3 回答 3

11

Excel 中的日期存储为自 1900 年 1 月 1 日以来的天数,但由于 1900 年不是闰年而存在一个错误。因此,您可以使用此 hack 创建一个 DateTime 对象(从 1900 年 3 月 1 日开始的日期有效):

$n = 41225;
$dateTime = new DateTime("1899-12-30 + $n days");

您可以使用以下内容格式化 DateTime 对象:

echo $dateTime->format("d M Y");

如果要包括时间和日期,请在转换之前乘以 86400(一天中的秒数)以获得自 1900 年 1 月 1 日以来的秒数:

$n = 42898.35416666;
$dateTime = new DateTime("1899-12-30 + ". round($n * 86400) . " seconds");
于 2012-12-19T23:56:01.640 回答
3

如果单元格具有将其格式化为日期的格式掩码,则使用 getFormattedValue() 方法而不是 getValue() 可能会有所帮助。getValue() 返回一个原始值,它(在本例中)是 Excel 序列号。

否则,PHPExcel_Shared_Date 类中的 ExcelToPHP() 或 ExcelToPHPObject() 方法应该完成返回 unix 时间戳或 PHP DateTime 对象的工作,然后您可以根据需要对其进行格式化

于 2012-12-19T23:58:35.573 回答
0

我必须以十进制格式转换日期序列号,即:42898.35416666,并且 DateTime 对象不采用小数。

基于 rjmunro 的回答和 animuson 的关于如何将小数转换为小时和分钟的回答,这里是十进制Excel 日期的解决方案。

function dateSerialToDateTime($dateserial) {
    $arrDate = explode(".", $dateserial);
    $n = $arrDate[0];
    $decimal = "." . $arrDate[1];  //decimal amount of seconds
    $duration = 86400 * $decimal;  //number of seconds in a day * decimal

    $dateTime = new DateTime("1899-12-30 + $n days");
    $converted = $dateTime->format("Y-m-d") . " " . gmdate("H:i:s", $duration);

    return $converted;
}
$dateserial = 42898.35416666;
die(dateSerialToDateTime($dateserial));

//returns 2017-06-12 08:29:59
于 2017-06-12T19:11:07.853 回答