错误的日期对话(ndY到Y-m-d H:i:s)

时间:2015-10-08 22:12:03

标签: php date date-conversion

我的代码返回错误的日期对话

<?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

问题:

  1. 为什么PHP无法将 ndY 转换为 Y-m-d H:i:s
  2. 为什么PHP会追加当前的小时数,而不是 00:00:00
  3. 注意:我尝试使用date()date_createdate_format并获得了相同的结果(错误的日期)

2 个答案:

答案 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;
} 

如果日期和月份都可能是一位数,那么您就遇到了麻烦!