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
相关产品推荐
相关产品推荐

