为什么DateTime :: createFromFormat('d-m-Y H:i A',$ date)-> format('d-m-Y')将日期更改为下午1点后的第二天?

时间:2018-12-04 06:24:13

标签: php datetime

为什么DateTime :: createFromFormat('d-m-Y H:i A',$ date)-> format('d-m-Y')将日期更改为下午1点后的第二天?

**注意 我认为这可能与“ H”或“ h”的格式有关 我仍在努力弄清楚。.

    $date = "04-12-2018 12:59 PM";
    $date_input = "04-12-2018 13:00 PM";

    echo $date . ' - date <br>';
    echo $date_input . ' - date_input <br>';

    var_dump($date);
    echo '<br/>';
    var_dump($date_input);
    echo '<br/>';

    echo DateTime::createFromFormat('d-m-Y H:i A', $date)->format('d-m-Y') . '<br/>';
    echo DateTime::createFromFormat('d-m-Y H:i A', $date_input)->format('d-m-Y') . '<br/>';

结果:

04-12-2018 12:59 PM - date

04-12-2018 13:00 PM - date_input 

string(19) "04-12-2018 12:59 PM" 

string(19) "04-12-2018 13:00 PM" 

04-12-2018

05-12-2018

3 个答案:

答案 0 :(得分:0)

您不能有13:00 PM 如果您执行格式化功能,则认为是第二天。

将代码更改为以下解决方案:

**注意:$ date_input和$ another_date的格式为'H或h'&'A'

$date = "04-12-2018 12:59 PM";
$date_input = "04-12-2018 13:00";
$another_date = "04-12-2018 01:00 PM" ;

echo $date . ' - date <br>';
echo $date_input . ' - date_input <br>';
echo $another_date . ' - another_date <br>';

var_dump($date);
echo '<br/>';
var_dump($date_input);
echo '<br/>';
var_dump($another_date);
echo '<br/>';

echo DateTime::createFromFormat('d-m-Y H:i A', $date)->format('d-m-Y') . '<br/>';
echo DateTime::createFromFormat('d-m-Y H:i', $date_input)->format('d-m-Y') . '<br/>';
echo DateTime::createFromFormat('d-m-Y h:i A', $another_date)->format('d-m-Y') . '<br/>';

答案 1 :(得分:0)

“ 13:00 pm”不是有效时间:在12小时时钟中,从1到12。您可以通过调用DateTime::getLastErrors()来检查解析是否失败:

php > echo DateTime::createFromFormat('d-m-Y H:i A', $date_input)->format('d-m-Y');
05-12-2018
php > print_r(DateTime::getLastErrors());
Array
(
    [warning_count] => 1
    [warnings] => Array
        (
            [19] => The parsed time was invalid
        )

    [error_count] => 0
    [errors] => Array
        (
        )

)

该实现似乎将下午13点视为凌晨1点,就像将“ 11月31日”视为12月1日一样。

答案 2 :(得分:0)

根据PHP documentation of DateTime::__construct()

  

不存在的值会翻转。

// Non-existent values roll over.
$date = new DateTime('2000-02-30');
echo $date->format('Y-m-d H:i:sP') . "\n";

输出

 2000-03-01 00:00:00-05:00

所以它不是bug,而是功能。