日期参数校验写法:网页表单里别让2月30日偷偷过关

做网站表单时,用户随手一填“2024-02-30”,系统居然没拦住?后台直接报错或存进数据库,后续查数据全乱套。这种坑,其实几行校验就能避开。

先看常见翻车现场

很多人用正则粗暴匹配 \d{4}-\d{2}-\d{2},结果“2023-13-01”“2024-02-30”全放行。正则管格式,不管逻辑——它不认闰年,也不知二月最多29天。

JavaScript 前端校验(简单可靠)

利用 Date 对象的自动修正特性:

function isValidDate(str) {
const d = new Date(str);
return d instanceof Date && !isNaN(d) &&
d.toISOString().slice(0, 10) === str;
}

试一下:isValidDate('2024-02-30') 返回 falseisValidDate('2024-02-29') 返回 true。原理是:Date 构造函数会把非法日期转成下一天(比如 '2024-02-30' 变成 '2024-03-01'),再比对字符串是否一致,不一致就说明原始输入无效。

后端也得守好门(以 Python Flask 为例)

前端能绕过,后端必须校验:

from datetime import datetime

def validate_date_str(date_str):
try:
dt = datetime.strptime(date_str, '%Y-%m-%d')
# 确保没有多余字符,且年月日完全匹配
if dt.strftime('%Y-%m-%d') != date_str:
return False
return True
except ValueError:
return False

调用 validate_date_str('2023-02-29') 直接返回 False,因为 2023 不是闰年。

小提醒:别忽略时区和空格

用户可能输 ' 2024-01-01 ' 或 '2024/01/01'。校验前先 .trim(),格式不统一就先统一转换,比如把斜杠替换成短横线再校验。

日期看着简单,一松手就埋雷。表单提交前咔嚓一验,比后期翻日志修数据省心十倍。