推荐答案
-- -------------------- ---- ------- -------- --------------- ------ - ----- ----- - --- ---------------------- ----- ----- - --- ---------------------- -- ------------- -- ------------- - ------ -------- ---- -------- - ----- ---- - -------------- - ------- ----- ------- - --------------- - ------ ----- ------- - ------------------ - ---- ----- ----- - ------------------ - ---- ----- ---- - ---------------- - ---- ------ - ------------------- ----- -------- -------- -------- -------- ------ ------ ----- ----- -- - -- -- ----- ----- - ----------- ---------- ----- ----- - ----------- ---------- ----- ---------- - --------------- ------- ------------------------ -- ------------------ ----- ----- - -------- ------ ----- ----- - ------------- --------------------------- -------- ---- -------- ---- -------
本题详细解读
核心思路
计算两个日期之间的时间差,核心是将日期转换为时间戳(毫秒数),然后计算时间戳的差值,最后再将差值转换为需要的时间单位。
JavaScript的 Date
对象提供了 getTime()
方法,可以获取指定日期的时间戳(从1970年1月1日00:00:00 UTC到该日期经过的毫秒数)。
代码解析
参数处理:
- 函数
timeDiff(date1, date2)
接受两个日期字符串作为参数。
- 函数
日期转换:
- 使用
new Date(date1).getTime()
和new Date(date2).getTime()
将日期字符串转换为Date
对象,并获取它们的时间戳。 - 通过
isNaN()
检查转换是否成功,如果有任何一个日期字符串无法解析,则返回"Invalid date format"
。
- 使用
时间差计算:
- 使用
Math.abs(time2 - time1)
计算两个时间戳的绝对差值。Math.abs()
确保结果为正数,这样时间差的计算顺序就不重要。
- 使用
时间单位转换:
- 毫秒:
diff
直接代表时间差的毫秒数。 - 秒:
Math.floor(diff / 1000)
将毫秒转换为秒,使用Math.floor()
向下取整。 - 分钟:
Math.floor(seconds / 60)
将秒转换为分钟。 - 小时:
Math.floor(minutes / 60)
将分钟转换为小时。 - 天:
Math.floor(hours / 24)
将小时转换为天。
- 毫秒:
结果返回:
- 返回一个包含时间差的毫秒,秒,分,时,天数的对象。
代码健壮性
- 日期格式校验: 使用
isNaN()
检查日期转换的结果,避免了无效日期导致的计算错误。 - 时间差顺序: 使用
Math.abs()
获取时间差绝对值,确保计算结果的正确性,无需考虑日期参数的先后顺序。
扩展
- 可以根据需求添加返回月和年等时间单位的计算。
- 可以对日期格式进行更加细致的校验,例如使用正则表达式。
- 可以考虑使用
moment.js
或date-fns
等日期处理库,它们提供了更丰富的功能和更友好的API。