PHP DateTime :: createFromFormat behavoiur

时间:2017-05-31 11:11:24

标签: php date datetime

今天我遇到了m/Y (05/2017)函数的行为让我感到困惑的事。

在我的情况下,我有一个字符串,用以下格式$date = \DateTime::createFromFormat('m/Y', '02/2017');表示日期。当我想将字符串转换为DateTime对象时,我遇到了以下问题:

$date

当我转储'2017-03-03 11:06:36.000000'变量时,里面的日期属性为$date = \DateTime::createFromFormat('d/m/Y', '01/02/2017');

但是如果我在月份$date = '01/'.$dateString;之前添加日期,我会找回一个具有正确日期属性的对象。 (不幸的是,我无法改变日期的格式并添加日期。它必须是m / Y)。

我提出的解决方法是将月份的第一天连接到我有ThreadLocal<Realm>的日期字符串,但我宁愿不这样做,因为它是硬编码的。

这里有什么问题? createFromFormat函数是否缺少如何创建对象的信息?我对此非常困惑。感谢大家的帮助!

2 个答案:

答案 0 :(得分:10)

默认情况下,PHP会使用当前日期/时间填充缺少的日期值;所以

setText

将使用当前日期填充缺失的日期值;并且由于2月31日是无效日期,它将向前推进到3月。同样,小时/分钟/秒将根据当前时间填充缺失的时间值。

如果要强制强制执行月份/时间的开头,请使用前导$date = \DateTime::createFromFormat('m/Y', '02/2017'); 修改掩码

!

这将填充当月1日的遗失日,以及$date = \DateTime::createFromFormat('!m/Y', '02/2017');

的时间

或者,尾随00:00:00将具有相同的效果

|

答案 1 :(得分:0)

您不能存储不完整的日期,至少不能以可用于复杂日期计算的专用日期格式存储(没有什么可以阻止您创建自己的MonthYear类)。因此,当您创建一个包含不完整信息的DateTime()对象时,需要发生一些事情:

  • 崩溃
  • 使用一些默认值

PHP选择第二个选项并做出继承自C语言日期库的决定:

  1. 假设缺失的数据意味着“现在”
  2. 尝试自动修复此算法可以创建的无效日期
  3. 在这种情况下,Feb 2017变为31 Feb 2017(因为“现在”是31 May 2017),PHP遵循这样的推理:二月2017年只有28天,但我还有三天;用户可能希望将这三天额外的日子搬到三月。因此3 Mar 2017

    我认为没有理由避免硬编码01,因为毕竟 是一个硬编码的值(为什么是本月的第一天,而不是最后一天或任何其他日子?)。

    $input = '05/2017';
    $date = \DateTime::createFromFormat('d/m/Y', "01/$input");