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

PHP中date函数返回错误星期值问题排查

问题原因与解决方案

嗨,我帮你找到了星期值错误的根源:你在代码里把DateTime对象转成了d/m/Y格式的字符串,然后用strtotime()去解析它,但**strtotime()默认会把/分隔的日期当成美式格式(月/日/年)**,这就会导致解析出错——比如27/02/2019会被它误认为是“27月2日”,显然不存在这样的日期,它就会返回一个错误的时间戳,最终得到错误的星期值。

最优解决方案:直接使用DateTime对象的方法

既然你已经有了$date这个DateTime实例,完全不需要转成字符串再重新解析,直接调用它的format()方法就能拿到正确的星期:

<?php 
$period = new DatePeriod( 
    new DateTime('27-02-2019'), 
    new DateInterval('P1D'), 
    new DateTime('03-03-2019') 
); 

foreach( $period as $date) { 
    $array[] = $date->format('d-m-y'); 
    $newDate = $date->format('d/m/Y'); 
    echo "The date is " .$newDate." "; 
    // 直接用DateTime对象获取星期,无需转时间戳
    $day = $date->format('l'); 
    echo "The day is ".$day." \n"; 
?> <br> <?}?>

备选方案:用正确的格式解析字符串(如果一定要转字符串的话)

如果你因为某些原因必须先转成d/m/Y字符串再处理,可以用DateTime::createFromFormat()来明确指定解析格式,避免歧义:

// 替换原来的时间戳和星期获取代码
$newDate = $date->format('d/m/Y');
$dateObj = DateTime::createFromFormat('d/m/Y', $newDate);
$day = $dateObj->format('l');

或者把日期转成strtotime能正确识别的Y-m-d格式:

$newDate = $date->format('Y-m-d');
$timestamp = strtotime($newDate);
$day = date('l', $timestamp);

这样就能保证星期值和日期对应上啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:01:17