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); ?>
修复说明
- 补上
$符号修正$holidays变量的语法错误; - 设置统一时区,确保日期解析与转换的一致性;
- 首次初始化数组时,直接将时间戳转为指定日期格式;
- 计算间隔天数时用
floor()处理,避免浮点运算带来的误差。
内容的提问来源于stack exchange,提问作者anmk
相关产品推荐
相关产品推荐

