JavaScript中如何判断字符串格式的给定日期是否已经过去一个月
原代码错误原因
- Date构造函数参数顺序错误:
new Date()接收参数的顺序是年、月(0~11)、日,你写的new Date(d, m, y)完全把顺序搞反了,加上你之前给月份加了1,最终得到的today日期完全不符合预期 - 未解析用户传入的日期字符串:
userDate是dd/mm/yyyy格式的字符串,不能直接和Date对象做算术运算,且原生Date默认不支持解析dd/mm/yyyy格式的字符串,直接使用会得到Invalid Date - 时间比较逻辑错误:两个Date对象相减得到的是毫秒差值,你判断
>30相当于只判断间隔是不是大于30毫秒,完全不符合「过去一个月」的需求;另外直接按30天计算也不严谨,不同月份天数不同,会出现判断偏差
正确实现代码
自然月对比版本(推荐,符合通用「过去一个月」认知)
逻辑为:将当前日期往前推1个月,只要用户传入的日期早于这个日期,就说明已经过去一个月
function isMoreThanOneMonthAgo(userDateStr) { // 解析dd/mm/yyyy格式的字符串为日、月、年数字 const [day, month, year] = userDateStr.split('/').map(Number); // JS的Date月份从0开始,所以月份要减1 const userDate = new Date(year, month - 1, day); // 非法日期校验,避免传入错误格式的字符串导致逻辑异常 if (isNaN(userDate.getTime())) { throw new Error('日期格式非法,请确保为dd/mm/yyyy格式'); } // 生成一个月前的日期对象 const oneMonthAgo = new Date(); oneMonthAgo.setMonth(oneMonthAgo.getMonth() - 1); // 日期比较,用户日期早于一个月前的日期则返回true return userDate < oneMonthAgo; } // 测试示例:若当前为2024/10/19,传入18/09/2024返回true,传入20/09/2024返回false console.log(isMoreThanOneMonthAgo('18/09/2024'));
固定30天对比版本
如果你的业务要求按满30天判断,可以用这个版本:
function isMoreThan30DaysAgo(userDateStr) { const [day, month, year] = userDateStr.split('/').map(Number); const userDate = new Date(year, month - 1, day); if (isNaN(userDate.getTime())) { throw new Error('日期格式非法,请确保为dd/mm/yyyy格式'); } // 30天对应的毫秒数:30 * 24小时 * 60分钟 * 60秒 * 1000毫秒 const THIRTY_DAYS = 2592000000; return Date.now() - userDate.getTime() > THIRTY_DAYS; }
内容的提问来源于stack exchange,提问作者Guilherme dos Reis Meneguello
相关产品推荐
相关产品推荐

