PHP日期解析异常:短天数月份被错误映射至下月
问题原因与解决方法
这是PHP DateTime类的已知行为,根源在于createFromFormat解析未完全指定的日期时,会用当前系统的日期补全缺失的部分。
比如你运行代码当天如果是31号,11月只有30天,31号在11月不存在,PHP就会自动把日期"滚"到12月1号,导致解析结果变成12月。同理,4、6、9月这些只有30天的月份,只要当前系统日期是31号,用My格式解析都会出现这个问题。
简便解决方法
方法1:强制重置到当月第一天
在格式字符串前加!,它会把未指定的日期部分重置为当月第一天、时间重置为00:00:00,彻底避免滚月问题:
$novDateString = 'Nov22'; $decDateString = 'Dec22'; $novDate = DateTime::createFromFormat('!My', $novDateString); $decDate = DateTime::createFromFormat('!My', $decDateString); echo $novDate->format('m'); // 输出11 echo $decDate->format('m'); // 输出12
方法2:解析后修正日期
如果不想修改格式字符串,可以在解析完成后调用modify方法,手动将日期设置为当月第一天:
$novDate = DateTime::createFromFormat('My', $novDateString)->modify('first day of this month');
内容的提问来源于stack exchange,提问作者sin tribu
相关产品推荐
相关产品推荐

