我一直在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 - >日期时间::格式()。
答案 0 :(得分:6)
尝试checkdate
功能。
检查所形成日期的有效性 通过论点。考虑日期 如果每个参数都正确,则有效 定义
<强>参数强>
月
月份介于1到12之间。
天
这一天在给定月份的允许天数内。 闰年被纳入 考虑。 强>
年
年份介于1到32767之间。
答案 1 :(得分:2)
扩展DateTime并重新实现默认构造函数以使用checkdate。 更容易做到这一点并替换所有 DateTime(与 MyDateTime(),以便您可以随时添加更多支票。例如年份&gt; 1940 ......
答案 2 :(得分:0)
要获取日期的组成部分,您只需拆分字符串...
$date = explode('/','02/18/2018');
然后使用checkdate(),现在您已拥有组件。