离成功只差一步!m
实际上是:
月份的数字表示,前导零从01到12
(http://php.net/manual/en/function.date.php)
也就是说,它期望月份有两个字符,而不是一个。如果你输入
$date = '08312015';
$newDate = DateTime::createFromFormat('ndY', $date);
它按照你的意愿运作
当你执行以下操作时:
$date = '8312015';
$newDate = DateTime::createFromFormat('ndY', $date);
您得到的是month=83,day=12,year=015
83个月是6年11个月,所以015+6=21
年+11个月=21年11月11日,即(0021-11-12
),与输出匹配。
编辑: 显然你想表达的是n
而非m
,问题在于日期部分没有分隔符,所以如前所述,月份应该是8还是83是不明确的...
再次编辑 我的“答案”只是解释了问题,没有显示如何解决它,所以...
如果字段没有用定界符(例如-
)或字段长度(即,m
始终是2个字符)进行分隔,则转换是模棱两可的。鉴于显然php认为83是一个有效的月份,并且格式为n
的月份可以有1个或多个数字,当php看到83时,它真的不能知道您是否表示“第8个月,然后以3开头的某些内容”还是“第83个月”。
因此,您需要消除歧义。一种消除歧义的方法是在左侧填充0,因为d
(出于所有实际目的而言Y
)始终是相同数量的数字(分别为2和4)。
因此,$date = str_pad($ date,8,“0”,STR_PAD_LEFT);
将8312015变为08312015,然后您可以使用m
进行格式化而不是n
,然后从那里开始就可以了。对于大于9的月份,它不会更改输入字符串,因此对于该ndY
格式中的所有字符串都是安全的。
DateTime::createFromFormat()
的手册。 - John Conde