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

WordPress Gravity Forms日期转Unix时间戳并加1年问题排查

解决Gravity Forms中dmy日期转Unix时间戳并增加1年的问题

看起来你已经搞定了dmy到Unix时间戳的转换,但在加一年的时候遇到了坑。我来帮你排查问题并给出可靠的解决方案——大概率是日期解析歧义或者加年的方式不够严谨导致的,咱们一步步来:

首先,先修复你的核心问题:正确转换dmy并加1年

先看调整后的完整代码,我会逐行解释关键点:

function rkv_datesubmit_fix2($form) {
    // 对应Gravity Forms里的日期字段ID
    $raw_start_date = $_POST['input_601'];
    $raw_end_date = $_POST['input_602'];

    // 关键:解决strtotime对dmy格式的解析歧义
    // strtotime默认把"/"分隔的日期当作mm/dd/yyyy,换成"-"就会识别为dd-mm-yyyy(dmy)
    $formatted_start = str_replace('/', '-', $raw_start_date);
    $formatted_end = str_replace('/', '-', $raw_end_date);

    // 转换为Unix时间戳
    $start_timestamp = strtotime($formatted_start);
    $end_timestamp = strtotime($formatted_end);

    // 给日期增加1年的正确姿势:用strtotime的基准时间参数
    $start_plus_1year = strtotime("+1 year", $start_timestamp);
    // 如果要给结束日期加1年,就用 $end_plus_1year = strtotime("+1 year", $end_timestamp);

    // 将处理后的时间戳赋值给目标字段(比如603)
    $_POST['input_603'] = $start_plus_1year;

    return $form;
}
add_filter('gform_pre_submission', 'rkv_datesubmit_fix2');

为什么你的原有代码可能出问题?

  1. 日期解析歧义:
    如果你输入的是dd/mm/yyyy格式(比如05/06/2024),strtotime()会默认把它当成mm/dd/yyyy(也就是2024年5月6日,而不是你想要的2024年6月5日),转换后的时间戳本身就错了,加一年自然也不对。把/换成-就能让strtotime正确识别dmy格式。

  2. 加年的方式不够严谨:
    如果你之前是直接用$fix_srt + 31536000(一年的秒数),这种方式会忽略闰年、不同月份天数的差异,导致日期不准确。用strtotime("+1 year", $timestamp)或者DateTime类会自动处理这些边界情况。

更可靠的方案:用DateTime类处理(推荐)

DateTime类可以明确指定输入格式,彻底避免解析歧义,而且处理闰年、月末日期(比如2月29日加一年)更准确,代码可读性也更高:

function rkv_datesubmit_fix2($form) {
    $raw_start_date = $_POST['input_601'];
    $raw_end_date = $_POST['input_602'];

    // 明确指定输入格式为d/m/Y,完全避免解析错误
    $start_date = DateTime::createFromFormat('d/m/Y', $raw_start_date);
    $end_date = DateTime::createFromFormat('d/m/Y', $raw_end_date);

    // 增加1年
    $start_date->add(new DateInterval('P1Y'));
    // $end_date->add(new DateInterval('P1Y')); // 给结束日期加年的话取消注释

    // 转换为Unix时间戳并赋值给字段
    $_POST['input_603'] = $start_date->getTimestamp();

    return $form;
}
add_filter('gform_pre_submission', 'rkv_datesubmit_fix2');

最后几个注意事项

  • 确保目标字段(比如603)是隐藏字段或者支持接收数值的字段类型(比如单行文本)
  • 确认$_POST['input_601']和$_POST['input_602']确实是dd/mm/yyyy格式的字符串(Gravity Forms的日期字段默认输出格式可以在字段设置里确认)
  • 钩子gform_pre_submission的使用是正确的,它会在表单提交前运行,适合修改提交数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:42:07