假设系统时间设置为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 :添加了有关命令行与浏览器的信息。
答案 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 。过程如下:
dateTime
对象提供格式化日期,但没有一天。null
天,因此使用今天的日期。 3)您在问题中声明今天的日期为2017-03-30
,因此将其应用于02-2017
的给定日期值:
30-02-2017
4)这显然无效,因此dateTime
对象过度此值并将其转换为02-03-2017
。
您需要Year - Month
的输出格式,它会为您提供2017-03
。
始终在日期中设置日期值。