>假设系统时间设置为 2017-03-30。然后此代码将错误地转换日期:
<?php
$dateTime = DateTime::createFromFormat('m-Y', '02-2017');
$converted = $dateTime->format('Y-m');
print_r($converted);
$converted
的值是
2017-03
但仅当从浏览器运行时。从命令行运行,它会给出正确的结果2017-02
.
有人知道为什么吗?二月没有30天,所以这可能是一个原因,但仍然如此。
编辑:将格式从"Y-m-d"更改为"Y-m"。
编辑 2:添加了有关命令行与浏览器的信息。
DateTime::__construct()
、DateTime::createFromFormat()
和strtotime()
用来解析各种日期和时间格式的规则以及它用来填充缺失组件的值在文档中进行了解释。
当它分析不完整的日期时,它会使用当前日期和时间中的值来查找缺少的组件。
在您的特定情况下,02-2017
将转换为"2017 年 2 月",使用当前月份日期 (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) 您为
dateTime
对象指定格式化日期,但没有日期。 - 2)dateTime对象不能使用
null
天,而是使用今天的日期。 -
3)您在问题中指出,今天的日期
2017-03-30
因此将其应用于给定的日期值02-2017
将产生:2017-02-30
-
4)这显然是无效的,因此
dateTime
对象会溢出此值并将其转换为02-03-2017
。
您需要Year - Month
的输出格式,这将为您提供2017-03
。
溶液:
始终在日期中设置日期值。