代码之家  ›  专栏  ›  技术社区  ›  JarsOfJam-Scheduler

在不滚动(错误)日期的情况下使用datetime::createfromformat()。

  •  0
  • JarsOfJam-Scheduler  · 技术社区  · 6 年前

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

    例子。

    1. 法国用户写道 58/57/5654 (或 55.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 回复  |  直到 5 年前
        1
  •  2
  •   Jack hardcastle    5 年前

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

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

    我们在这里所做的是检查提供的日期字符串与从该日期字符串创建的日期,这将向我们指示是否发生了您所说的“滚动”。

    这将需要一些适应来为您的代码库工作,但希望这会给您一些开始工作的一般方法?