我的代码返回错误的日期对话
<?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
问题:
ndY
转换为 Y-m-d H:i:s
00:00:00
注意:我尝试使用date()
,date_create
,date_format
并获得了相同的结果(错误的日期)
答案 0 :(得分:2)
如此接近! m
实际上是:
一个月的数字表示,前导零到第112行
(http://php.net/manual/en/function.date.php)
所以,这意味着它希望它是2个字符,而不是1个字符。如果你这样做
$date = '08312015';
$newDate = DateTime::createFromFormat('ndY', $date);
它的工作方式
当你这样做时
$date = '8312015';
$newDate = DateTime::createFromFormat('ndY', $date);
你得到月= 83,白天= 12,年= 015
83个月是6年+ 11个月 所以,015+6=21
年+11个月= 21年11月11日,即(0021-11-12
),与输出相匹配
修改:显然您的意思是n
而不是m
,问题是您在日期部分之间没有分隔符,因此,正如已经说过的那样,这是不明确的至于月份应该是8还是83 ......
再次编辑我的回答&#34;只是解释了我猜的问题而没有展示如何修复它,所以......
如果字段不是由分隔字符(如-
)或字段长度(即m
如何总是 2个字符)分隔,那么转换是模棱两可的。鉴于明显的PHP认为83是一个有效的月份,并且格式化为n
的一个月可能有1位或更多位数,当php看到83时,它真的不知道你的意思是&#34;第8个月然后以3&#34;或者&#34;第83个月&#34;。
所以,你需要做的是消除分界的歧义。消除歧义的一种方法是在左侧填充0,因为d
(并且所有意图和目的Y
)总是相同的数字位数(分别为2和4)
所以,$date=str_pad($date, 8, "0", STR_PAD_LEFT);
会转变
8312015进入08312015,然后您可以使用m
格式而不是n
,您应该可以从那里开始。几个月&gt; 9,它不会改变输入字符串,因此对于ndY
格式的所有字符串都是安全的。
答案 1 :(得分:1)
答案是您的输入数据必须标准化。我不知道你使用的是什么标准,但我会假设最后四个字符总是一年。
现在我不知道的是:这个月的日期总是必须是两个字符,还是你能得到像'112015'这样的日期?如果是这样你应该怎么做'1112015'? 1月11日或11月1日?
规范化数据非常重要。
假设月中的某一天总是两位数,那么最简单的解决方案就是:
if ( strlen($date)<8 ) {
$date = '0'.$date;
}
如果日期和月份都可能是一位数,那么您就遇到了麻烦!