如何使用DateTime类将'02 / 31/2010'作为无效日期捕获?

时间:2009-06-15 18:02:49

标签: php datetime date

我一直在PHP中使用DateTime类,因为date()具有Unix时间戳的缺点。但是,这两种方法都没有检测到没有31天的月份的无效日期,但是尝试使用第31天。

示例代码:

try {
    $date = new DateTime('02/31/2018');
    $formattedDate = $date->format('Y-m-d');
}
catch (Exception $e) {
}
echo $formattedDate;

示例输出:

2018-03-03

更新1:

要使用checkdate(),我需要日期的组成部分。为此,我需要使用日期字符串作为构造函数来实例化DateTime对象。在'02 / 31/2018'的情况下,它将在实例化时将其转换为'03 / 03/2018'。此时,通过checkdate()运行组件月,日,年将为时已晚。解决方案是什么?

更新2:

如果我强制使用特定格式(例如mm / dd / yyyy),那么获取组件部分日期很容易,但如果我接受strtotime()接受的所有格式,则在通过strtotime运行之前我无法执行checkdate( ) - > date()或DateTime :: __ construct - >日期时间::格式()。

我一直在PHP中使用DateTime类,因为date()具有Unix时间戳的缺点。但是,这两种方法都没有检测到没有31天的月份的无效日期,但是尝试使用第31天。

示例代码:

try {
    $date = new DateTime('02/31/2018');
    $formattedDate = $date->format('Y-m-d');
}
catch (Exception $e) {
}
echo $formattedDate;

示例输出:

2018-03-03

更新1:

要使用checkdate(),我需要日期的组成部分。为此,我需要使用日期字符串作为构造函数来实例化DateTime对象。在'02 / 31/2018'的情况下,它将在实例化时将其转换为'03 / 03/2018'。此时,通过checkdate()运行组件月,日,年将为时已晚。解决方案是什么?

更新2:

如果我强制使用特定格式(例如mm / dd / yyyy),那么获取组件部分日期很容易,但如果我接受strtotime()接受的所有格式,则在通过strtotime运行之前我无法执行checkdate( ) - > date()或DateTime :: __ construct - >日期时间::格式()。

3 个答案:

答案 0 :(得分:6)

尝试checkdate功能。

  

检查所形成日期的有效性   通过论点。考虑日期   如果每个参数都正确,则有效   定义

     

<强>参数

     

     

月份介于1到12之间。

     

     

这一天在给定月份的允许天数内。    闰年被纳入   考虑。

     

     

年份介于1到32767之间。

答案 1 :(得分:2)

扩展DateTime并重新实现默认构造函数以使用checkdate。 更容易做到这一点并替换所有 DateTime( MyDateTime(),以便您可以随时添加更多支票。例如年份&gt; 1940 ......

答案 2 :(得分:0)

要获取日期的组成部分,您只需拆分字符串...

$date = explode('/','02/18/2018');

然后使用checkdate(),现在您已拥有组件。