使用DateTime::createFromFormat()而不滚动(错误的)日期



让用一种语言编写的错误日期58/57/5654(或58.57.5654(成为一组语言的一部分,其中日期的编写方式不同(例如:法语日期、英语日期和德语日期(。我想通过传递语言的日期格式和这个错误的日期来调用DateTime::createFromFormat(),目的是根据语言检索错误的(或正确的(日期、月份和年份。

示例

  1. 法国用户编写了58/57/5654(或58.57.5654(。所以我想得到:(day, month, year) = (58, 57, 5654)

  2. 英国用户写的是同一个日期。我会得到:(day, month, year) = (57, 58, 5654)

  3. 对于德国人来说,这将和法国人一样。

问题

使用,如果给定的日期值错误,DateTime::createFromFormat($the_format, $the_date);将对日期的日、月和年值执行滚动。例如:string(10) "58/57/5654"变为正确的,但不需要的,日期为string(10) "28/10/5658"

我该如何避免这种滚动?

请参阅:https://secure.php.net/manual/fr/datetime.createfromformat.php

我不确定是否可以禁用此功能,但如果发生这种情况,您可以检查

$date = DateTimeImmutable::createFromFormat($format, $dateString);
if(!$date || ($date->format($format) !== $dateString)) {
throw new InvalidDateException($dateString);
}

我们在这里所做的是将提供的日期字符串与根据该日期字符串创建的日期进行检查,这将向我们指示是否发生了您所说的"展期"。

这将需要一些调整来为您的代码库工作,但希望这能为您提供一些开始工作的通用方法?

最新更新