今天我遇到了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函数是否缺少如何创建对象的信息?我对此非常困惑。感谢大家的帮助!
答案 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语言日期库的决定:
在这种情况下,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");