前面的代码就不写了,翻来覆去都是那几句
多数情况下EXCEL表格的时间格式导入进来的时候很有可能是一个5位的整数,比如说43320
首先我们得知道这个43320怎么来的
我先随手写了一个时间 2018/8/8,excel自动识别为日期并且帮助我自动设置了日期格式,如下图

设置单元格式为 常规,如下显示

使用phpspreadsheet导入的时候读取的实际是这个单元格的常规格式,这个43320的意思就是1900-01-01到现在过去了多少天
但是PHP是计算从1970-01-01开始的,所以需要减去这中间70年的天数
即: 365*70 + 18(中间的润年天数) + 1 = 25569
那么用43320 - 25569 = 17751天
17751 * 24 * 3600 = 1533686400
时间戳转时间还是会的吧?
假设你的代码是这么写的
$date = $spreadsheet->getActiveSheet()->getCellByColumnAndRow(1, $row)->getValue();
那么你就需要在下面加一行
$date = date('Y-m-d', ($date - 25569) * 24 * 3600);那么输出的时间就是2018-08-08
————————————————
ai修改版:
/**
* 精准转换Excel时间数值为指定格式(修复时区/闰年bug)
* @param float|int $excelTime Excel时间数值(如45380.690729167、46001)
* @param string $timezone 时区(默认中国上海)
* @return string|null 转换结果,失败返回null
*/
function excelTimeToDateTime($excelTime, $timezone = 'Asia/Shanghai') {
// 1. 输入验证
if (!is_numeric($excelTime) || $excelTime < 0) {
return null;
}
// 2. 初始化时区
$dtZone = new DateTimeZone($timezone);
// 3. 处理Excel 1900闰年bug(核心修正点)
// Excel错误认为1900年是闰年,多了"1900-02-29"这一天,需修正
$correction = 0;
if ($excelTime > 60) { // 60对应Excel中错误的1900-02-29
$correction = 1;
} elseif ($excelTime == 60) {
return '1900-02-28'; // 直接返回正确日期
}
// 4. 分离整数(天数)和小数(时分秒)部分
$days = (int)$excelTime; // 提取整数天数
$fraction = $excelTime - $days;// 提取小数部分(当天的时间占比)
// 5. 基于Excel 1900基准计算日期(1900-01-01 = 1)
$baseDate = new DateTime('1900-01-01', $dtZone);
// 修正:减1天(Excel起始为1) + 减闰年bug的1天(如需)
$baseDate->modify(($days - 1 - $correction) . ' days');
// 6. 处理小数部分(时分秒)
if ($fraction > 0) {
$seconds = round($fraction * 86400); // 小数转秒数(1天=86400秒)
$baseDate->modify("+{$seconds} seconds");
}
// 7. 根据是否有小数返回对应格式
return $fraction === 0
? $baseDate->format('Y-m-d')
: $baseDate->format('Y-m-d H:i:s');
}
// ========== 测试你的示例 ==========
date_default_timezone_set('Asia/Shanghai'); // 全局时区保障
// 测试1:带小数的时间值
$time1 = 45380.690729167;
echo "原始值 {$time1} 转换后:" . excelTimeToDateTime($time1) . PHP_EOL;
// 测试2:整数的日期值
$time2 = 46001;
echo "原始值 {$time2} 转换后:" . excelTimeToDateTime($time2) . PHP_EOL;
版权声明:本文为CSDN博主「暮影重生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42821361/article/details/89102583
再也不在你们面前装二刺螈高手了
我现在把好多技术文章都隐藏了,感觉有点碍眼……因为好多不是手动一个个字敲出来的文章,放在那显得有点陌生的文章