You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

strtotime日期转换异常:首个时间戳格式与对应日期错误问题

问题分析与修复

你的代码存在两个明确问题,还有一个潜在语法错误,逐一解决:

问题1:首个元素为时间戳而非日期格式

首次初始化$currentRange时,直接将$time_stamp存入数组,未执行日期格式转换,导致数组第一个元素是原始时间戳。

问题2:时间戳对应日期偏差一天

strtotime("2022-12-15")生成的是UTC时区2022-12-15 00:00:00的时间戳,若服务器本地时区比UTC早(比如东八区),用date()转换时会自动转成本地时间,最终显示为12-14-2022,这是时区不匹配导致的偏差。

潜在语法错误

变量holidays前缺少$符号,属于语法错误,会导致代码无法正常执行。


修复后的完整代码

<?php
date_default_timezone_set('Asia/Shanghai'); // 设置为业务需要的时区,比如东八区

$lastDate = null;
$currentRange = array();
$holidays = array("2022-12-15","2022-12-16","2022-12-17","2022-12-28","2022-12-29");
$fromdate = strtotime("2022-12-30"); // 示例fromdate,根据实际业务赋值

foreach($holidays as $holiday)
{
    $time_stamp = strtotime($holiday);

    if($time_stamp <= $fromdate)
    {
        if (null === $lastDate)
        {
            // 首次添加时直接转换为指定日期格式
            $currentRange[] = date('m-d-Y', $time_stamp);
        }
        else
        {
            // 用floor确保整数间隔,避免时区或毫秒级差异导致的浮点误差
            $interval = floor(($time_stamp - $lastDate) / 86400);

            if ($interval == 1) {
                $currentRange[] = date('m-d-Y', $time_stamp);   
            } else {
                $currentRange = array(date('m-d-Y', $time_stamp));
            }
        }
        $lastDate = $time_stamp;
    }
}

print_r($currentRange);
?>

修复说明

  1. 补上$符号修正$holidays变量的语法错误;
  2. 设置统一时区,确保日期解析与转换的一致性;
  3. 首次初始化数组时,直接将时间戳转为指定日期格式;
  4. 计算间隔天数时用floor()处理,避免浮点运算带来的误差。

内容的提问来源于stack exchange,提问作者anmk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:35:18