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

时间:2018-11-16 15:34:06

标签: php datetime datetime-format

用一组语言的语言部分写错了日期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

1 个答案:

答案 0 :(得分:2)

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

$date = \DateTimeImmutable::createFromFormat($format, $dateString);

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

我们在这里所做的是将提供的日期字符串与根据该日期字符串创建的日期进行比较,这将向我们指示是否发生了“翻转”(如您所说的那样)。

这需要一些适应性才能适合您的代码库,但是希望,这为您提供了一些通用的方法来开始工作?