You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP的date()函数中同时使用两种日期格式?

解决方案

首先要明确你的duedate字段类型,分两种情况处理:

情况1:duedate是日期/时间类型(DATE、DATETIME等)

这种情况下完全不需要纠结前导零问题。MySQL的MONTH()、DAYOFMONTH()函数会直接从日期字段中提取数字形式的月、日,不管存储时的显示格式带不带前导零。你当前的代码已经可以正确匹配,无需修改——date('n')返回的无前导零月份(1-12)和MONTH(duedate)的结果是完全一致的,日期同理。

情况2:duedate是字符串类型(VARCHAR等),同时存储了带前导零和不带前导零的格式

如果字段是字符串,需要先把字符串转成日期类型再做判断,或者同时匹配两种格式。推荐用STR_TO_DATE统一转换,这样不管字符串是2024-05-01还是2024-5-1都能正确识别:

修改后的代码如下:

$month = date('n');
$day = date('j');
$year = date('Y');

$request = $DBFunc['db_query']('', '
    SELECT COUNT(duedate)
    FROM {db_prefix}dulas
    WHERE is_did = {int:is_did}
        AND MONTH(STR_TO_DATE(duedate, "%Y-%c-%e")) = {int:month}
        AND DAYOFMONTH(STR_TO_DATE(duedate, "%Y-%c-%e")) = {int:day}
        AND YEAR(STR_TO_DATE(duedate, "%Y-%c-%e")) >= {int:year}',
    array(
        'is_did' => 0,
        'year' => $year,
        'month' => $month,
        'day' => $day,
    )
);

其中%c匹配无前导零的月份,%e匹配无前导零的日期,STR_TO_DATE会自动兼容带前导零的格式。

另外你之前尝试的date('n' || 'm')写法是错误的,date()函数仅接受单个格式字符串参数,不能通过逻辑或同时指定两种格式。

内容的提问来源于stack exchange,提问作者Athlant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:32:53