在前端业务开发中,我们经常会遇到需要处理日期数组的场景,比如从接口获取到一批商品的到期时间,需要从中找到最近的、且有效的到期日期,这时候就需要先过滤无效日期,再进行排序筛选。

核心实现思路
整个流程可以分为三个核心步骤:
- 遍历日期数组,逐个校验日期是否有效
- 过滤掉所有无效日期,得到纯净的有效日期数组
- 对有效日期数组进行排序,取第一个元素即为最近的到期日期
日期有效性校验方法
判断一个日期字符串是否为有效日期,核心逻辑是将字符串转换为Date对象后,检查其时间戳是否为NaN,同时可以额外校验日期字符串的格式是否符合预期。以下是通用的校验函数:
/**
* 校验日期字符串是否为有效日期
* @param {string} dateStr 待校验的日期字符串
* @returns {boolean} 是否为有效日期
*/
function isValidDate(dateStr) {
// 先排除空值情况
if (!dateStr) return false;
const date = new Date(dateStr);
// 时间戳为NaN说明日期无效
if (isNaN(date.getTime())) return false;
// 可选:校验日期字符串格式是否为YYYY-MM-DD,避免类似"2024-13-01"这种转换后被浏览器自动修正的无效日期
const dateReg = /^d{4}-d{2}-d{2}$/;
if (!dateReg.test(dateStr)) return false;
// 拆分字符串和转换后的日期年月日对比,避免浏览器自动修正的问题
const [year, month, day] = dateStr.split('-').map(Number);
if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {
return false;
}
return true;
}
获取最近到期日期的完整实现
结合上面的校验函数,我们可以实现获取最近到期日期的完整逻辑,这里默认最近的到期日期是指距离当前时间最近的未来日期,如果需要包含过去的日期可以调整排序逻辑:
/**
* 获取数组中最近的到期日期,排除无效日期
* @param {string[]} dateArr 日期字符串数组
* @returns {string|null} 最近的到期日期字符串,没有有效日期则返回null
*/
function getNearestExpireDate(dateArr) {
// 过滤无效日期
const validDates = dateArr.filter(item => isValidDate(item));
// 没有有效日期直接返回null
if (validDates.length === 0) return null;
// 将有效日期转换为时间戳,按从小到大排序(最近的未来日期排在前面)
const now = Date.now();
const sortedDates = validDates.map(dateStr => ({
dateStr,
timestamp: new Date(dateStr).getTime()
})).sort((a, b) => {
// 优先排未来的日期,未来的日期按时间从近到远排
const aIsFuture = a.timestamp >= now;
const bIsFuture = b.timestamp >= now;
if (aIsFuture && !bIsFuture) return -1;
if (!aIsFuture && bIsFuture) return 1;
// 都是未来日期或者都是过去日期,按时间升序排
return a.timestamp - b.timestamp;
});
return sortedDates[0].dateStr;
}
使用示例
我们可以用一组测试数据来验证函数的正确性:
// 测试数据,包含有效日期、无效日期、过去日期、未来日期
const testDateArr = [
'2024-12-31', // 有效未来日期
'2023-10-01', // 有效过去日期
'2024-06-15', // 有效未来日期
'invalid-date', // 无效日期
'2024-13-01', // 无效日期(月份超出范围)
'', // 空值无效
'2024-05-20' // 有效未来日期
];
const result = getNearestExpireDate(testDateArr);
console.log(result); // 输出:2024-05-20,是最近的未来有效日期
注意事项
在实际使用中需要注意几个问题:
- 如果业务需要包含过去的日期作为最近到期日期,可以去掉排序逻辑里的未来日期优先判断,直接按时间戳升序排序即可
- 如果日期数组里的时间包含时分秒信息,可以调整
isValidDate函数的正则校验规则,适配对应的日期格式 - 不同浏览器对日期字符串的解析可能存在细微差异,建议统一使用
YYYY-MM-DD这类标准格式传递日期数据,减少兼容性问题
日期处理是前端开发中的常见需求,做好无效日期的过滤可以避免很多线上异常,建议将这类通用逻辑封装成公共函数,在多个业务场景中复用。
JavaScript数组处理日期校验最近到期日期日期排序修改时间:2026-07-18 23:39:22