You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:24:05