如何通过周数创建DateTime?解决createFromFormat返回false问题
解决:DateTime::createFromFormat按周数生成日期返回false的问题
我之前也踩过一模一样的坑!用DateTime::createFromFormat('Y-W-d','2019-45-09')总是返回bool(false),完全没法生成预期的日期对象。
问题根源
Y-W-d这个格式串的用法存在核心问题:W代表ISO周数,但createFromFormat并不支持直接用Y-W-d这种组合解析日期——ISO周数和日期的对应需要遵循特定规则,而这个方法对这种组合的解析逻辑并不完善,尤其是当你传入的日(比如这里的09)超出ISO周的天数范围(ISO周的天数是1-7,1=周一,7=周日)时,直接就会解析失败返回false。
正确解决方案
想要按ISO年、周数和天数生成日期,最好用专门的setISODate()方法,它就是为这种场景设计的,用法如下:
// 定义参数:年、周数、ISO周内天数(1-7),以及时分秒微秒 $year = 2019; $week = 45; $day = 2; // 注意:1=周一,7=周日,根据你的实际需求调整 $hour = 0; $minute = 0; $second = 0; $microseconds = 0; // 生成目标日期对象 $date = (new DateTime())->setISODate($year, $week, $day)->setTime($hour, $minute, $second, $microseconds); var_dump($date);
额外提示
setISODate()会自动处理周数跨年份的特殊情况(比如每年的第1周可能包含上一年的最后几天),准确性拉满;- 一定要注意ISO周的天数范围是1到7,如果你原始代码里的
09是笔误,记得改成符合要求的数值哦。
内容的提问来源于stack exchange,提问作者LF-DevJourney
相关产品推荐
相关产品推荐

