PHP DateTime::__construct():当年份为三位数字时,无法解析时间字符串

Posted

技术标签:

【中文标题】PHP DateTime::__construct():当年份为三位数字时,无法解析时间字符串【英文标题】:PHP DateTime::__construct(): Failed to parse time string when the year is three digit number 【发布时间】:2022-01-16 22:22:56 【问题描述】:

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

DateTime::__construct():在位置 7 (4) 解析时间字符串 (12-12-940) 失败:意外字符

代码本身很简单,我只是在来自客户端请求的值上调用new /DateTime

【问题讨论】:

那么用4位数的年份标准,有什么问题? 如果你把940变成0940就可以了 @RiggsFolly 问题是我无法发送 0940 因为这是从日期选择器值发送的,并且日期选择器将始终修剪前导零 请注意,对于 mysql,支持的日期范围是 '1000-01-01' 到 '9999-12-31'。 dev.mysql.com/doc/refman/5.7/en/datetime.html 如果您真的需要旧日期,那么您将需要一种不同的方法。 【参考方案1】:

错误信息告诉你一切。 DateTime 期望年份为四位数字。如果您的年份只有三位数,则必须添加填充零。 new \DateTime("12-12-0940"); 完美运行。

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

$padded_year str_pad($year, 4, '0', STR_PAD_LEFT);

您还可以将此代码与 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]));

【讨论】:

【参考方案2】:

DateTime 的构造函数无法处理三位数的年份。一种可能的解决方案是像这样使用setDate()

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

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

【讨论】:

以上是关于PHP DateTime::__construct():当年份为三位数字时,无法解析时间字符串的主要内容,如果未能解决你的问题,请参考以下文章

DateTime::__construct(): 无法在位置 0 (2) 解析时间字符串 (2): 中的意外字符

PHP DateTime 类命名空间

错误500:DateTime :: __ construct():无法解析时间字符串

PHP如何使用SplQueue::__construct()函数?示例

PHP 构造方法 __construct()

PHP浅谈__construct()的继承与调用