PHP 中EXCEL导入浮点型的日期转成格式化本地日期和时间

PHP中在做EXCEL数据导入的时候,遇到EXCEL单元格中的日期时间显示的是标准的格式化时间,实际上是浮点型(单元格设置成文本可体现),这个时候要导入数据就必须对其进行转化,
转成我们需要的时间格式,这个时候我没有找到PHP有原生方法,后面发现PHPEXCEL里面有一个方法可以实现转换(提供一位前辈用PHPEXCEL的实现连接 link:https://blog.csdn.net/yicixing7/article/details/54290446 ,更简单的连接 link:https://blog.csdn.net/wendan564447508/article/details/52596176 供大家参考),
这就必须需要PHPEXCEL插件的支持,由于需要自己把这个方法拿出来,以方便以后特殊场景的使用。

解释:float类型时间其实是距离指定时间的天数,小数前是整数天所以是日期,小数后面的是当天又不满一整天所以时分秒。

25569 = 365 * 70 + 18(1900-1970之间闰年数) + 1(1900-01-01)

附:MAC环境下没有测试过,有测试后发现不对的伙伴请告知我。


/**
 * EXCEL  中读取到的时间原型是 浮点型,现在要转成 格式化的标准时间格式
 *        返回的时间是 UTC 时间(世界协调时间,加上8小时就是北京时间)
 * @param float|int $dateValue Excel浮点型数值
 * @param int $calendar_type 设备类型 默认Windows 1900.Windows  1904.MAC
 * @return int 时间戳
 */
function getDateByFloatValue($dateValue = 0,$calendar_type = 1900){
    // Excel中的日期存储的是数值类型,计算的是从1900年1月1日到现在的数值
    if (1900 == $calendar_type) { // WINDOWS中EXCEL 日期是从1900年1月1日的基本日期
        $myBaseDate = 25569;// php是从 1970-01-01 25569是到1900-01-01所相差的天数
        if ($dateValue < 60) {
            --$myBaseDate;
        }
    } else {// MAC中EXCEL日期是从1904年1月1日的基本日期(25569-24107 = 4*365 + 2) 其中2天是润年的时间差?
        $myBaseDate = 24107;
    }

    // 执行转换
    if ($dateValue >= 1) {
        $utcDays = $dateValue - $myBaseDate;
        $returnValue = round($utcDays * 86400);
        if (($returnValue <= PHP_INT_MAX) && ($returnValue >= -PHP_INT_MAX)) {
            $returnValue = (integer)$returnValue;
        }
    } else {
        // 函数对浮点数进行四舍五入
        $hours = round($dateValue * 24);
        $mins = round($dateValue * 1440) - round($hours * 60);
        $secs = round($dateValue * 86400) - round($hours * 3600) - round($mins * 60);
        $returnValue = (integer)gmmktime($hours, $mins, $secs);
    }

    return $returnValue;// 返回时间戳
}

date_default_timezone_set('PRC');// 设置时区为北京时间

$date_float = 43222.108796;// 小数点前面是年月日,后面是时分秒
$date_int   = getDateByFloatValue($date_float);// 获取浮点型时间对应的时间戳(UTC时间)
$date_local = date('Y-m-d H:i:s',$date_int);// 得到本地时区的标准时间
$date_utc   = gmdate('Y-m-d H:i:s',$date_int);// 得到UTC的标准时间

echo '浮点型时间:'.$date_float,"<br/>\n";
echo '整形时间:'.$date_int,"<br/>\n";
echo '本地时区时间:'.$date_local,"\t 与PHP设置时区有关<br/>\n";
echo 'UTC时间:'.$date_utc,"<br/>\n";

运行结果:

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值