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');
为什么你的原有代码可能出问题?
日期解析歧义:
如果你输入的是dd/mm/yyyy格式(比如05/06/2024),strtotime()会默认把它当成mm/dd/yyyy(也就是2024年5月6日,而不是你想要的2024年6月5日),转换后的时间戳本身就错了,加一年自然也不对。把/换成-就能让strtotime正确识别dmy格式。加年的方式不够严谨:
如果你之前是直接用$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
相关产品推荐
相关产品推荐

