PHP DateTime::_construct():当年份是三位数时,无法分析时间字符串

PHP DateTime::_construct():当年份是三位数时,无法分析时间字符串,php,symfony,datetime,Php,Symfony,Datetime,我有一个Symfony控制器,它接收来自客户端的请求,并且必须将输入的日期(例如12-12-2004)解析为DateTime对象,并将其存储在数据库中。它工作得很好,除非我尝试输入一个包含三位数年份的日期,例如: DateTime::_构造:无法分析位置7处的时间字符串12-12-940 4:意外字符 代码本身非常简单,我只是根据来自客户端请求的值调用new/DateTime。错误消息告诉您一切。DateTime应为四位数的年份。如果您的年份只有三位数,则必须添加填充零。新的\DateTime1

我有一个Symfony控制器,它接收来自客户端的请求,并且必须将输入的日期(例如12-12-2004)解析为DateTime对象,并将其存储在数据库中。它工作得很好,除非我尝试输入一个包含三位数年份的日期,例如:

DateTime::_构造:无法分析位置7处的时间字符串12-12-940 4:意外字符


代码本身非常简单,我只是根据来自客户端请求的值调用new/DateTime。

错误消息告诉您一切。DateTime应为四位数的年份。如果您的年份只有三位数,则必须添加填充零。新的\DateTime12-12-0940;工作完美

要填充字符串,可以使用str_pad

您还可以将此代码与array_map相结合,将日期字符串拆分并连接到正确的填充日期字符串,如下所示

$date = "2-2-940";
$date = join('-', array_map(function($number, $padding) {
    return str_pad($number, $padding, '0', STR_PAD_LEFT);
}, explode('-', $date), [2,2,4]));
DateTime的构造函数无法处理三位数的年份。一种可能的解决方案是使用如下方式:

$dateString = "12-12-940";
list($day, $month, $year) = explode('-', $dateString);

$date = new DateTime();
$date->setDate($year, $month, $day);

所以使用4位数的年份标准,有什么问题吗?如果你把940变成0940@RiggsFolly问题是我无法发送0940,因为这是从datepicker值发送的,datepicker将始终修剪前导零。请注意,对于mysql,支持的日期范围是“1000-01-01”到“9999-12-31”。如果你真的需要旧的日期,那么你将需要一个不同的方法。
$dateString = "12-12-940";
list($day, $month, $year) = explode('-', $dateString);

$date = new DateTime();
$date->setDate($year, $month, $day);