<?PHP
$date = '8312015';
$newDate = DateTime::createFromFormat('ndY', $date);
$convertedDate = $newDate->format('Y-m-d H:i:s');
echo $convertedDate;
退货
0021-11-12 17:04:56
期望:
2015-08-31 00:00:00
问题:
>为什么PHP无法将ndY转换为Y-m-d H:i:s
>为什么PHP会附加当前时间,而不是00:00:00
注意:我尝试使用date(),date_create,date_format并得到相同的结果(错误的日期)
解决方法:
很近! m实际上是:
Numeric representation of a month, with leading zeros 01 through 12
(http://php.net/manual/en/function.date.php)
因此,这意味着它期望是2个字符,而不是1个字符.如果你这样做
$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格式的所有字符串都是安全的.