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
相关产品推荐
相关产品推荐

