如何解决Date.parse误判含日期片段的非日期字符串为合法日期的问题
解决方案
原生Date.parse的逻辑是只要字符串中存在可识别的日期片段就会尝试解析,所以会出现把包含日期的URL识别为合法日期的问题。我们可以在调用Date.parse前增加一步格式预校验,仅允许包含日期相关的合法字符的字符串进入解析环节,就可以过滤掉混入其他无关内容的非日期字符串,同时保留原生对合法日期格式的解析能力。
自定义实现代码
function safeDateParse(str) { // 可根据业务需要调整允许的字符:当前支持数字、常用日期时间分隔符、中英文时间标识 const validDateRule = /^[\d./\-:\s年月日周时分秒apmAPM]*$/; const trimStr = str.trim(); // 格式校验不通过直接返回NaN if (!validDateRule.test(trimStr)) return NaN; // 校验通过后走原生解析逻辑,和原生效果完全对齐 return Date.parse(trimStr); }
效果验证
- 非日期场景:
safeDateParse('https://www.example.com/2021/03/03')返回NaN,符合预期 - 合法日期场景:
safeDateParse('2020.01.01')返回值和原生Date.parse('2020.01.01')完全一致safeDateParse('01/10/2020')返回值和原生Date.parse('01/10/2020')完全一致- 带时间的格式
2023-12-25 14:30:00、中文格式2020年1月1日也可正常识别
如果需要更严格的过滤规则,可以调整正则表达式,比如增加分隔符数量校验,过滤纯数字字符串等场景。
内容的提问来源于stack exchange,提问作者Anil
相关产品推荐
相关产品推荐

