【问题标题】:PHP datetime create from format return wrong resultPHP datetime create from format 返回错误结果
【发布时间】:2021-07-05 04:03:39
【问题描述】:

我需要检查一个字符串是否与某种格式匹配,并且我使用DateTime::createFromFormat 来强制执行它。但它有一些错误。

例如我有一个日期:2020 年 8 月 15 日,我尝试将其解析为格式为“d/m/Y”的日期时间对象,然后将其打印为其他格式:

   DateTime::createFromFormat("d/m/Y", '8/15/2020')->format('d-m-Y')
   // result: 08-03-2021

那是 wreig,因为我在 php.net https://www.php.net/manual/en/datetime.createfromformat.php 中阅读过 他们说:d:日(1->30),m:月(1->12),Y:年(2020)

但我得到了一个奇怪的结果?它是如何工作的?还是bug?

谢谢你的回答。

【问题讨论】:

标签: php datetime datetime-format


【解决方案1】:

我认为PHP手册不正确。

如果超出日期或月份的范围,DateTime::getLastErrors() 方法会生成警告。你可以评价一下。举个例子:

function DateTimeCreateFromStrictFormat($format, $input){
  $dt = DateTime::createFromFormat($format, $input);
  $errArr = DateTime::getLastErrors();
  return $errArr['warning_count']+$errArr['error_count'] ? false : $dt;
}
$dt = DateTimeCreateFromStrictFormat("d/m/Y", '8/15/2020');
var_dump($dt);  //bool(false)

$dt = DateTimeCreateFromStrictFormat("d/m/Y", '8/12/2020');
var_dump($dt);  //object(DateTime)#2 (3) { ["date"]=> string(26) "2020-12-08 10:34:34.000000" ..

【讨论】:

    【解决方案2】:

    您的格式是day/month/year,但没有像8/15/2020 那样的月份15

    你是说15/8/2020吗?

    【讨论】:

    【解决方案3】:

    我尝试将其解析为格式为“d/m/Y”的日期时间对象

    ...目前尚不清楚您为什么要那样尝试。 8/15/2020 显然是 m/d/Y。您需要使用它实际写入的格式对其进行解析。

    之后您可以再次将其输出到d/m/Y - 这是一个单独的操作。

    DateTime::createFromFormat("m/d/Y", '8/15/2020')->format('d-m-Y')
    

    【讨论】:

    • 不,实际上我想检查字符串 ('8/15/2020') 是否符合“d/m/Y”格式。我尝试使用 DateTime::createFromFormat 函数。但似乎它仍然有效结束返回给我一个意想不到的日期
    • 您的问题并不清楚。不幸的是,您不能以这种方式将 createFromFormat 用作验证工具 - 即使它似乎没有意义,它也会始终尽力做到最好并根据提供的数据创建日期。要严格验证格式,您可能需要使用某种正则表达式。
    • “很遗憾,您不能以这种方式使用 createFromFormat 作为验证工具” - php.net/manual/en/datetime.getlasterrors.php 可以告诉您出了点问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2019-04-06
    • 2014-10-17
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多