将excel dateserial转换回可读日期格式

时间:2012-12-19 23:43:03

标签: php codeigniter phpexcel

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

我尝试了以下但是没有用。

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

3 个答案:

答案 0 :(得分:10)

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");

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

$n = 42898.35416666;
$dateTime = new DateTime("1899-12-30 + ". round($n * 86400) . " seconds");

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

我必须转换十进制格式的dateserial数字,即:42898.35416666,而DateTime对象不带小数。

根据rjmunro的回答和animuson对how to convert decimals to hours and minutes的回答,这里是十进制 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