如何在TypeScript中验证日期是否无效?
TypeScript 无效日期验证修复方案
原代码无法正常工作的核心问题有两个:
- 仅通过
instanceof Date判断会漏掉字符串格式的日期(比如前端传入的ISO 8601字符串),这类场景在业务中非常常见。 isNaN(Number(date))的判断逻辑不够严谨,部分边缘场景可能出现误判。
下面给出两种实用的修复方案:
方案1:兼容字符串与Date实例的通用验证
先封装一个工具函数,统一处理字符串和Date实例的有效性判断:
function isInvalidDate(date: Date | string): boolean { const parsedDate = typeof date === 'string' ? new Date(date) : date; // 验证是否为合法Date实例,且时间戳有效 return !(parsedDate instanceof Date) || isNaN(parsedDate.getTime()); }
替换原代码中的判断逻辑:
// 检查日期是否无效 else if (isInvalidDate(giftCards[i].expiry)) return new Result(true, ErrorCode.BadRequest, 'Expiry Date out of range', { index: i, giftCard: giftCards[i] });
方案2:严格校验ISO日期格式(可选)
如果业务要求日期必须是标准ISO 8601格式(避免2023-02-30这类逻辑无效的日期),可以加上格式正则校验:
// 匹配标准ISO 8601日期格式 const ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(.\d{3})?)?(Z|[+-]\d{2}:\d{2})?$/; function isInvalidDate(date: Date | string): boolean { if (typeof date === 'string') { // 先校验格式,再验证解析后的日期是否与原字符串一致(避免自动修正的无效日期) if (!ISO_DATE_REGEX.test(date)) return true; const parsedDate = new Date(date); return isNaN(parsedDate.getTime()) || parsedDate.toISOString() !== date; } return !(date instanceof Date) || isNaN(date.getTime()); }
补充说明
- 用
getTime()替代Number(date)是因为前者语义更明确,专门用于获取Date的时间戳,可读性更强。 - 对于字符串日期,必须先解析为Date实例再判断有效性,不能直接用
instanceof否定。
内容的提问来源于stack exchange,提问作者codingmickey
相关产品推荐
相关产品推荐

