PHP调用DateTime::createFromFormat按y-z格式转日期返回false
问题根源
你遇到解析失败的核心原因有两个,而且你之前94转换“正常”的结果本身就是错误的,只是巧合没触发报错:
- 格式符完全用错
你使用的格式串y-d里,d代表的是月份内的日期,合法取值是01-31,且解析时固定读取2位数字:- 传入
21-94时,d刚好读完两位94,虽然94远大于月内日期的最大值31,但PHP会自动把超量的日期进位折算成后续月份的日期,所以最终返回了一个DateTime对象,但这个日期和你预期的「2021年第94天」完全无关,是错误结果。 - 传入
21-104时,d只会读取前两位10作为月内日期,剩下的末尾数字4没有对应的格式占位符匹配,直接触发解析失败返回false。
- 传入
- 你需要的是年积日(一年中的第几天)解析,对应PHP日期格式里的
z占位符,这个占位符的取值范围是0-365,和你原生成代码里date("z")的返回规则完全一致(1月1日返回0)。
另外要注意:你这套整数生成逻辑本身有设计缺陷,完全没有考虑闰年366天的情况,每经过一个闰年就会产生1天的日期偏移,属于旧系统遗留问题,如果只做旧数据兼容可以不用调整,新逻辑建议直接存标准日期格式避免这类问题。
修复代码
// $expire 是从数据库读取的过期整数值 $dayOfYear = $expire % 365; $twoDigitYear = (int)(($expire - $dayOfYear) / 365); // 用z占位符匹配年积日完成解析 $date = DateTime::createFromFormat('y-z', $twoDigitYear . '-' . $dayOfYear);
内容的提问来源于stack exchange,提问作者Apollo79
相关产品推荐
相关产品推荐

