Excel儲存日期為序列數值(如42000),需轉換為標準Y-m-d格式。提供通用轉換函數支援兩種算法。
function excelTime($date, $time = false) {
if (function_exists('GregorianToJD')) {
if (is_numeric($date)) {
$jd = GregorianToJD(1, 1, 1970);
$gregorian = JDToGregorian($jd + intval($date) - 25569);
$date = explode('/', $gregorian);
$date_str = str_pad($date[2], 4, '0', STR_PAD_LEFT)
. "-" . str_pad($date[0], 2, '0', STR_PAD_LEFT)
. "-" . str_pad($date[1], 2, '0', STR_PAD_LEFT)
. ($time ? " 00:00:00" : '');
return $date_str;
}
} else {
// 兼容無Calendar擴展環境
$date = $date > 25568 ? $date + 1 : 25569;
$ofs = (70 * 365 + 17 + 2) * 86400;
$date = date("Y-m-d", ($date * 86400) - $ofs) . ($time ? " 00:00:00" : '');
}
return $date;
}
GregorianToJD/JDToGregorian,基於儒略日計算,精準度高-25569修正// Excel讀取到的日期欄位值
$excelDate = 43831; // 對應 2020-01-01
echo excelTime($excelDate); // 輸出: 2020-01-01
echo excelTime($excelDate, true); // 輸出: 2020-01-01 00:00:00
提示:現代專案建議使用PhpSpreadsheet(PHPExcel繼任者)原生支援日期格式轉換,減少手動處理。