系统时间为3月30日时,DateTime转换错误

Oll*_*edt 2 php date

假设系统时间设置为2017-03-30.然后这段代码将错误的日期转换为:

<?php
$dateTime = DateTime::createFromFormat('m-Y', '02-2017');
$converted = $dateTime->format('Y-m');
print_r($converted);
Run Code Online (Sandbox Code Playgroud)

价值$converted

2017-03
Run Code Online (Sandbox Code Playgroud)

但仅限于从浏览器运行时.从命令行运行,它给出了正确的结果2017-02.

谁知道为什么?2月没有30天,所以这可能是一个原因,但仍然存在.

编辑:将格式从"Ymd"更改为"Y-m".

编辑2:添加了有关命令行与浏览器的信息.

axi*_*iac 6

该规则使用DateTime::__construct(),DateTime::createFromFormat()strtotime()解析各种日期和时间格式,并使用它来填补缺失的组件在解释值的文档.

当它解析一个不完整的日期时,它会使用当前日期和时间中缺失组件的值.

在您的具体情况下,02-2017使用当月的某一天(30)转换为"2017年2月" .即2017年2月30日,然后标准化为2017年3月2日.

您可以DateTime::createFromFormat()通过!在格式字符串中放置一个感叹号()来告诉将所有组件初始化为Unix纪元(而不是当前日期和时间):

$dateTime = DateTime::createFromFormat('!m-Y', '02-2017');
print_r($dateTime);
Run Code Online (Sandbox Code Playgroud)

它输出:

DateTime Object
(
    [date] => 2017-02-01 00:00:00.000000
    [timezone_type] => 3
    [timezone] => UTC
)
Run Code Online (Sandbox Code Playgroud)