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

Php 系统时间为3月30日时,日期时间转换错误,php,date,Php,Date,假设系统时间设置为2017-03-30。然后此代码将转换错误的日期: <?php $dateTime = DateTime::createFromFormat('m-Y', '02-2017'); $converted = $dateTime->format('Y-m'); print_r($converted); 但仅当从浏览器运行时。从命令行运行,它将给出正确的结果2017-02 有人知道为什么吗?二月没有30天,所以这可能是一个原因,但仍然是 编辑:将格式从“Y-m-d”更改

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

<?php
$dateTime = DateTime::createFromFormat('m-Y', '02-2017');
$converted = $dateTime->format('Y-m');
print_r($converted);
但仅当从浏览器运行时。从命令行运行,它将给出正确的结果
2017-02

有人知道为什么吗?二月没有30天,所以这可能是一个原因,但仍然是

编辑:将格式从“Y-m-d”更改为“Y-m”

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

这里的内容已过运行。过程如下:

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

    30-02-2017

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

您需要一个
年-月
的输出格式,该格式将为您提供
2017-03

解决方案: 始终在日期中设置日期值

和用于解析各种日期和时间格式的规则以及用于填充缺少的组件的值在中进行了说明

当它解析一个不完整的日期时,它将使用当前日期和时间中的值来查找缺少的组件

在您的特定情况下,
02-2017
将使用月份的当前日期(
30
)转换为“2017年2月”,作为缺少的月份日期。即2017年2月30日,然后正常化至2017年3月2日

通过在格式字符串中放置感叹号(
),可以告诉您将所有组件初始化为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
)

在我的环境中,
$converted
产生:
2017-02-02
(UTC-03:00)@RagenDazs OK,因此它可以是某个地方的设置。谢谢。正如我在回答和评论中所说的。请澄清向
$dateTime
构造添加日值是否可以解决此问题。中解释了用于解析各种日期和时间格式的规则以及用于填充缺失组件的值。在您的特定情况下,
02-2017
将使用月份的当前日期(
30
)转换为“2017年2月”,作为缺少的月份日期。即2017年2月30日,然后正常化为2017年3月2日。@RagenDazs,因为今天是5月2日。海报在问题中指出,“错误”行为发生在系统日期为2017-03-30时。事实上,我会将@Ragen放在右上方-如果我将代码片段放在它自己的文件中,它会按预期工作;在我的软件中,它给出了错误的结果。问题是哪种环境影响了这一点。好吧,你在你的问题中没有提到这一点。你需要概述(编辑)问题,展示两个系统之间的差异,两个系统的输出差异,并从中吸取教训。它可能是不同版本的PHP或
dateTime
对象的不同设置,或者是
PHP.ini
中的系统时间设置。我的答案解决了您在问题中提出的问题,但您现在正在从命令行移动目标帖子,以了解您的问题实际上在问什么
:-p
,它会给出正确的结果,而不是从浏览器。是的,我会更新这个问题。如果在DateTime对象中设置了
day
值,则应该让我们知道问题是否消失@奥利奥斯特
DateTime Object
(
    [date] => 2017-02-01 00:00:00.000000
    [timezone_type] => 3
    [timezone] => UTC
)