前面的代码就不写了,翻来覆去都是那几句

多数情况下EXCEL表格的时间格式导入进来的时候很有可能是一个5位的整数,比如说43320

首先我们得知道这个43320怎么来的
我先随手写了一个时间 2018/8/8,excel自动识别为日期并且帮助我自动设置了日期格式,如下图

20190408191011580.png

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

20190408185520402.png

使用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