功能说明
支付表单需要判断 MM/YY 格式的卡有效期是否仍有效。该工具把两位年份映射到 2000 年代,按月份最后一天结束的时刻判断过期,并允许注入当前时间以便测试。返回结果包含是否有效、原因以及解析出的月份和年份,便于表单展示具体错误。
关键代码
parseExpiry 用正则限制月份 01 到 12 和两位年份,返回月份与四位年份。isExpired 用 Date.UTC 构造下个月第一天,当前时间大于等于该时刻即视为过期,因此当月仍然有效。validateExpiry 组合解析与判断并返回原因。
const endOfMonth = new Date(Date.UTC(year, month, 1));
return now.getTime() >= endOfMonth.getTime();
使用注意
两位年份统一按 2000 到 2099 解释,不适用于其他世纪。格式必须是 MM/YY,不接受 1/26 或带空格的月份,但斜杠两侧空白允许。比较使用绝对时间,服务器时区不同不会改变结果,但月初边界仍按 UTC 计算。该函数不校验卡号或 CVV。
验证方式
注入 2026-01-15,断言 validateExpiry(“01/26”).valid 为 true,validateExpiry(“12/25”).valid 为 false。注入 2026-02-01 后 01/26 过期。格式错误抛 RangeError,月份 13 被拒绝,传入非字符串抛 TypeError,无效 Date 抛 TypeError。