You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将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

火山引擎 最新活动