做网站表单时,用户随手一填“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') 返回 false;isValidDate('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(),格式不统一就先统一转换,比如把斜杠替换成短横线再校验。
日期看着简单,一松手就埋雷。表单提交前咔嚓一验,比后期翻日志修数据省心十倍。