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

时间:2017-05-02 14:09:34

标签: php date

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

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

$converted的值是

2017-03

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

任何人都知道为什么? 2月没有30天,所以这可能是一个原因,但仍然。

修改:更改了&#39; Y-m-d&#39;到了&#39; Y-m&#39;。

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

2 个答案:

答案 0 :(得分:6)

DateTime::__construct()DateTime::createFromFormat()strtotime()用于解析各种日期和规则的规则时间格式以及用于填充缺失组件的值在the documentation中进行了解释。

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

在您的具体情况下,02-2017将转换为&#34; 2017年2月&#34;使用当月的某一天(30)表示缺少的某一天。即2017年2月30日,然后标准化为2017年3月2日。

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

$dateTime = DateTime::createFromFormat('!m-Y', '02-2017');
print_r($dateTime);

输出:

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

答案 1 :(得分:3)

这里有 over-run 。过程如下:

  • 1)您为dateTime对象提供格式化日期,但没有一天。
  • 2)然后dateTime对象无法使用null天,因此使用今天的日期。
  • 3)您在问题中声明今天的日期为2017-03-30,因此将其应用于02-2017的给定日期值:

      

    30-02-2017

  • 4)这显然无效,因此dateTime对象过度此值并将其转换为02-03-2017

您需要Year - Month的输出格式,它会为您提供2017-03

解决方案:

始终在日期中设置日期值。