You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用new Date()计算当前日期到目标日期的剩余时间并格式化展示

解决时间差计算与格式化问题

嘿,这两个问题本质上都是计算两个时间点的差值并按需求格式化输出,我给你整理了一套实用的JavaScript方案,直接就能套用!

核心思路

不管是计算当前日期与创建日期的剩余时间,还是到未来预约时间的剩余时间,步骤都是一致的:

  1. 当前时间目标时间都转换成Date对象,获取对应的时间戳(毫秒数)
  2. 计算两个时间戳的差值(确保是未来时间减当前时间,得到正的剩余毫秒数)
  3. 将毫秒差值拆解为月、周、日、小时等维度,只保留数值非零的维度

针对问题2的具体实现(含通用函数)

你的预约数据是带日期和时间段的对象,我们先取时间段的开始时间拼接成完整的目标时间字符串,再传入通用计算函数:

1. 通用剩余时间计算与格式化函数

function getRemainingTime(targetDate) {
  const now = new Date();
  const target = new Date(targetDate);
  
  // 处理目标时间已过期的情况
  const diffMs = target.getTime() - now.getTime();
  if (diffMs <= 0) return "目标时间已过";

  // 计算月份差(用Date对象直接计算,避免固定天数估算的误差)
  const years = target.getFullYear() - now.getFullYear();
  const months = target.getMonth() - now.getMonth() + years * 12;
  
  // 计算扣除整月后的剩余天数
  const tempDate = new Date(now);
  tempDate.setMonth(tempDate.getMonth() + months);
  const diffDays = Math.floor((target - tempDate) / (1000 * 60 * 60 * 24));
  
  // 拆解周、剩余天数、小时、分钟、秒
  const weeks = Math.floor(diffDays / 7);
  const remainingDays = diffDays % 7;
  const diffHours = Math.floor((diffMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  const diffMinutes = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60));
  const diffSeconds = Math.floor((diffMs % (1000 * 60)) / 1000);

  // 收集非零维度并拼接结果
  const resultParts = [];
  if (months > 0) resultParts.push(`${months}个月`);
  if (weeks > 0) resultParts.push(`${weeks}周`);
  if (remainingDays > 0) resultParts.push(`${remainingDays}天`);
  if (diffHours > 0) resultParts.push(`${diffHours}小时`);
  if (diffMinutes > 0) resultParts.push(`${diffMinutes}分钟`);
  if (diffSeconds > 0) resultParts.push(`${diffSeconds}秒`);

  return resultParts.join(",");
}

2. 处理你的预约数据

// 你的预约对象
const appointment = { 
  appointment_date: "Tue Oct 20 2020", 
  appointment_hour: "08:00 - 09:00" 
};

// 拼接完整的目标时间字符串(取时间段的开始时间)
const targetTimeStr = `${appointment.appointment_date} ${appointment.appointment_hour.split(" - ")[0]}`;

// 调用函数获取剩余时间
const remainingTime = getRemainingTime(targetTimeStr);
console.log(remainingTime);
// 假设当前时间是你给出的Fri Oct 09 2020 09:59:21,输出会是:「1周,4天,22小时,1分钟,39秒」

解决问题1的方案

问题1其实就是把创建日期作为目标时间传入上面的getRemainingTime函数即可,比如:

// 假设创建日期是字符串或Date对象
const createDate = "2020-05-15"; // 或者 new Date(2020, 4, 15)
const remainingFromCreate = getRemainingTime(createDate);
console.log(remainingFromCreate);

关键说明

  • 月份计算的准确性:没有用固定30天估算月数,而是通过Date对象的getMonth()getFullYear()直接计算,避免了不同月份天数不同带来的误差。
  • 非零维度过滤:通过判断每个维度的数值是否大于0,只保留有意义的部分,符合你的需求。
  • 过期处理:如果目标时间已经过去,会直接返回提示,避免出现负数的剩余时间。

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

火山引擎 最新活动