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

Wrong Date Conversation (ndY to Y-m-d H:i:s)

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

<?php
$date = '8312015';
$newDate = DateTime::createFromFormat('ndY', $date);
$convertedDate = $newDate->format('Y-m-d H:i:s');
echo $convertedDate;

Returns

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

注意:我尝试了 date()date_createdate_format,但得到了相同的结果(日期错误)

太近了! m 实际上是:

Numeric representation of a month, with leading zeros 01 through 12

(http://php.net/manual/en/function.date.php)

所以,这意味着它期望它是 2 个字符,而不是一个。如果你这样做

$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是模棱两可的...

再次编辑我的"answer"只是解释了我猜想的问题,但没有说明如何解决它,所以...

如果字段未通过定界字符(如 -)或字段长度(即,m 始终是 来定界2 个字符)则转换不明确。鉴于显然 php 认为 83 是有效月份,并且格式为 n 的月份可能有 1 个或多个数字,当 php 看到 83 时,它真的不知道你的意思“第 8 个月,然后以 3 开头”或 "the 83rd month".

因此,您需要做的是消除定界的歧义。消除歧义的一种方法是在左侧填充 0,因为 d(并且出于所有意图和目的 Y)始终是相同数量的数字(分别为 2 和 4)

所以,$date=str_pad($date, 8, "0", STR_PAD_LEFT); 会变成 8312015 到 08312015,然后你可以使用 m 来格式化而不是 n,你应该可以从那里开始。对于大于 9 的月份,它不会更改输入字符串,因此对于 ndY 格式的所有字符串都是安全的。

答案是您的输入数据必须规范化。我不知道您使用的是什么标准,但我假设最后四个字符始终是年份。

现在我不知道的是:一个月中的第几天是否必须始终是两个字符,或者您可以得到像“112015”这样的日期吗?如果是这样,您应该如何处理“1112015”? 1 月 11 日还是 11 月 1 日?

规范化数据非常重要。

假设月份中的第几天总是两位数,最简单的解决方案是:

if ( strlen($date)<8 ) {
  $date = '0'.$date;
} 

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