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

JavaScript开发:按需展示剩余月、周、日的日期对比函数

实现按日期区间展示剩余时间的JavaScript函数

我帮你把这个倒计时逻辑完善好,刚好能匹配你要的三种展示规则!先理清楚核心思路:先判断起始日期和当前日期的所属区间(跨月、同月不同周、同周),再根据区间计算对应的剩余时间并格式化输出。

第一步:先写几个日期判断的辅助工具

要实现规则,得先能准确判断日期是不是在当前月、当前周:

// 判断日期是否在当前月
function isInCurrentMonth(date) {
  const now = new Date();
  return date.getFullYear() === now.getFullYear() && date.getMonth() === now.getMonth();
}

// 判断日期是否在当前ISO周(按国际标准,周一为一周起始)
function isInCurrentWeek(date) {
  const now = new Date();
  const nowWeek = getISOWeek(now);
  const nowYear = now.getFullYear();
  const targetWeek = getISOWeek(date);
  const targetYear = date.getFullYear();
  
  return targetYear === nowYear && targetWeek === nowWeek;
}

// 辅助函数:获取日期的ISO周数
function getISOWeek(date) {
  const tempDate = new Date(date.getTime());
  tempDate.setHours(0, 0, 0, 0);
  // 以周四为周中间点,确保周数计算符合ISO标准
  tempDate.setDate(tempDate.getDate() + 3 - (tempDate.getDay() + 6) % 7);
  const yearStart = new Date(tempDate.getFullYear(), 0, 1);
  return Math.ceil((((tempDate - yearStart) / 86400000) + 1) / 7);
}

第二步:结合你已有代码写完整的格式化函数

把你已经拿到的起始日期和当前日期逻辑整合进去,实现三种场景的展示:

function formatRemainingTime(startDateStr) {
  // 对应你代码里的nurl和countDownDate逻辑
  const countDownDate = new Date(startDateStr).getTime();
  const now = new Date().getTime();
  const distance = countDownDate - now;

  // 处理已过期的情况
  if (distance < 0) {
    return "已过期";
  }

  const startDate = new Date(startDateStr);
  
  // 场景1:起始日期不在当前月 → 展示剩余月数+周数
  if (!isInCurrentMonth(startDate)) {
    const nowDate = new Date();
    // 计算剩余月数(年份差转成月数+月份差)
    const monthDiff = (startDate.getFullYear() - nowDate.getFullYear()) * 12 + (startDate.getMonth() - nowDate.getMonth());
    // 剩余月数之外的天数转成周数(取整)
    const remainingDaysAfterMonths = Math.floor((distance % (30 * 24 * 60 * 60 * 1000)) / (24 * 60 * 60 * 1000));
    const remainingWeeks = Math.floor(remainingDaysAfterMonths / 7);
    return `${monthDiff}个月 ${remainingWeeks}周`;
  } 
  // 场景2:起始日期在当前月但不在当前周 → 展示剩余周数+天数
  else if (!isInCurrentWeek(startDate)) {
    const remainingDays = Math.floor(distance / (24 * 60 * 60 * 1000));
    const remainingWeeks = Math.floor(remainingDays / 7);
    const remainingDaysAfterWeeks = remainingDays % 7;
    return `${remainingWeeks}周 ${remainingDaysAfterWeeks}天`;
  } 
  // 场景3:起始日期在当前周 → 仅展示剩余天数
  else {
    const remainingDays = Math.floor(distance / (24 * 60 * 60 * 1000));
    return `${remainingDays}天`;
  }
}

// 你可以这样调用(对应你代码里的items[i]逻辑)
// const nurl = items[i].CounterStartDate.toString();
// console.log(formatRemainingTime(nurl));

小细节说明

  • 月份计算:因为不同月份天数差异大,用「年份差转月数+月份差」的方式更直观,剩余天数转周数时直接取整忽略零头;
  • 周的判断:用ISO标准周(周一为第一天),如果你的业务需要周日当周起始,可以调整getISOWeek里的逻辑;
  • 过期提示:如果起始日期已经过了,返回「已过期」,你可以根据需求改成别的提示语。

内容的提问来源于stack exchange,提问作者John John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:25:00