如何将Excel日期序列号(如43676)转换为标准日期格式?
解决Excel日期数值转PHP标准日期的问题
你遇到的问题核心是Excel的日期数值和PHPdate()函数使用的Unix时间戳不是一个体系:
- Excel的日期数值是从
1899-12-31(Windows版,对应数值1为1900-01-01)开始累计的天数; - 而PHP的
date()函数需要的是Unix时间戳——从1970-01-01 00:00:00 UTC开始累计的秒数。
你直接把43676传给date(),相当于告诉PHP“从1970年1月1日过了43676秒”,这才十几个小时,结果自然是1970-01-01。
几种可靠的解决方法:
方法1:用数学转换直接生成Unix时间戳
Windows版Excel中,1970-01-01对应的数值是25569,我们可以通过这个差值把Excel天数转成秒数:
$value = 43676; // 计算Unix时间戳:(Excel数值 - 1970年对应的Excel数值) × 一天的秒数(86400) $timestamp = ($value - 25569) * 86400; $datum = date("Y-m-d", $timestamp); echo $datum; // 输出:2019-07-30
方法2:用PHP的DateTime类(推荐,更灵活)
DateTime类可以直接基于起始日期做天数偏移,代码可读性更高,还能方便处理时区:
$value = 43676; // 从Excel的起始日期1899-12-31开始,加上对应天数 $date = new DateTime("1899-12-31 +{$value} days"); echo $date->format('Y-m-d'); // 输出:2019-07-30
或者用createFromFormat的写法:
$value = 43676; $date = DateTime::createFromFormat('j', $value); $date->modify('1899-12-31'); echo $date->format('Y-m-d');
注意事项
如果是Mac版Excel,默认使用1904日期系统(起始日期为1904-01-01),这时候1970-01-01对应的数值是24107,需要把方法1中的25569换成24107,或者方法2中的起始日期换成1904-01-01并调整天数(数值1对应1904-01-01,所以要减1天:new DateTime("1904-01-01 +".($value-1)." days"))。
内容的提问来源于stack exchange,提问作者pia-sophie




