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";
运行结果: