1、使用php-EXCEL
2.1版本
历史项目,使用的是Laravel:5.6
版本,Excel
插件使用maatwebsite/excel:2.1.30
,导入Excel
数据的时候发现,有一些日期
接收的时候变成了数值
类型,如43126.0
。
google
一下,发现原来excel
中表示日期
的文本格式确实一组纯数字
,而且这个纯数字
就是一个偏移的值
。这个偏移的值
是距离1900/1/0 0:00:00
的一个天数值
,2015/5/20
的文本格式42144.6580671296
正好是距离1900/1/0 0:00:00
的天数。
那么距离1900/1/0 0:00:00
的43123
天正好就是2018
后的某一天。43123/365=118.xxx年
,1900+118=2018
。
因为PHPExcel
中将所有的列解析成文本格式,读出的时间是距离1900-01-01的偏移天数
。
即excel
的日期
是从 1900-01-01
开始计算的(php 是从 1970-01-01
),两者间有一个天数差 42144.6580671296
。时间是格林威治时间
。
2、编写通用函数解决该问题
if (!function_exists('str_to_date')) {
/**
* (false|string) str_to_date_format : 将 "2017年7月10日" "2017.7.10" 转为标准的日期格式"2017-7-10"
*
* @param $date
* @param boolean $falseReturnNow 格式错误是否返回当前日期
* @param string $format
*
* @return false|string
*/
function str_to_date_format($date, $falseReturnNow=true, $format='Y-m-d') {
if (!$falseReturnNow && !$date) {
return null;
}
// 接收的日期如果是数值型则用PHPExcel的内置方法转换成时间戳
if (is_numeric($date)) {
$timestamp = \PHPExcel_Shared_Date::ExcelToPHP($date);
return date($format, $timestamp);
}
$date = str_replace(['号', '日'], '', $date);
$date = str_replace(['年', '月', '.', '—', '——', '/', '-', '--'], '-', $date);
// 如果时间格式错误,是否需要返回当前时间
if (date($format, strtotime($date)) == '1970-01-01' && $falseReturnNow && DateTime::createFromFormat('Y-m-d G:i:s', $date) === FALSE) {
return date($format);
}
return date($format, strtotime($date));
}
}
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!