PHP DateTime :: createFromFormat behavoiur

Whi*_*ash 5 php datetime date

今天我遇到了一些让我对这个\DateTime::createFromFormat函数的行为感到困惑的事情.

在我的情况下,我有一个字符串,表示以下格式的日期m/Y (05/2017).当我想将字符串转换为DateTime对象时,我遇到了以下问题:

$date = \DateTime::createFromFormat('m/Y', '02/2017');

当我转储$date变量时,里面的日期属性是'2017-03-03 11:06:36.000000'

但是如果我在月份之前添加日期,$date = \DateTime::createFromFormat('d/m/Y', '01/02/2017');我会找回具有正确日期属性的对象.(遗憾的是,我无法更改日期的格式并添加日期.它必须是m/Y).

我提出的修复方法是将月份的第一天连接到我拥有的日期字符串,$date = '01/'.$dateString;但我宁愿不这样做,因为它是硬编码的.

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

Mar*_*ker 10

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

$date = \DateTime::createFromFormat('m/Y', '02/2017');
Run Code Online (Sandbox Code Playgroud)

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

如果要强制强制执行月份/时间的开头,请使用前导修改掩码 !

$date = \DateTime::createFromFormat('!m/Y', '02/2017');
Run Code Online (Sandbox Code Playgroud)

这将填补失踪的一天,在这个月的第一天和时间 00:00:00

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

$date = \DateTime::createFromFormat('m/Y|', '02/2017');
Run Code Online (Sandbox Code Playgroud)

  • 阅读[精确规范](http://php.net/manual/en/datetime.createfromformat.php#refsect1-datetime.createfromformat-parameters)很有意思,以了解`!`和`|`代码的工作方式。基本上,它们将值设置为Unix Epoch-我们获得第1天,因为它恰好是1970年1月1日UTC。 (2认同)