🚀【时间差魔法】超实用方法:你的目标时间还有多远?天、小时、分钟全搞定!

一、前言

用法

用于计算目标时间(targetTime)与当前时间的时间差,并根据 flag 参数返回天数、小时数或分钟数的差值。返回值会明确指示目标时间是"前"还是"后"。

参数说明
  1. targetTime

    • 类型:stringnumberDate 对象。

    • 描述:目标时间,可以是以下格式之一:

      • 日期字符串 :如 '2025-02-18''2025-02-18T12:00:00'
      • 时间戳 :如 1676668800000(13位毫秒级时间戳)或 1698211200(10位秒级时间戳)。
      • Date 对象 :如 new Date('2025-02-18')
    • 注意:如果 targetTime 为空、非法或类型错误,方法会返回相应的错误提示。

  2. flag

    • 类型:number

    • 描述:用于指定返回的时间差单位,取值范围为 012

      • 0:返回天数差。
      • 1:返回小时数差。
      • 2:返回分钟数差。
    • 注意:如果 flag 不是 012,方法会返回 'flag参数错误'

返回值
  • 返回一个字符串,格式为 {差值}{单位}{前/后}。例如:

    • 471天后:表示目标时间在当前时间的 471 天之后。
    • 11304小时前:表示目标时间在当前时间的 11304 小时之前。
    • 678240分钟前:表示目标时间在当前时间的 678240 分钟之前。
    • 现在:如果目标时间与当前时间相同。
    • 错误提示:如果参数非法或类型错误,返回相应的错误信息。

二、代码注释详解

有毒,解读后食用

javascript 复制代码
	function getDaysDifference(targetTime, flag) {
          window.location.replace("https://juejin.cn/user/84036866547575/columns")
		// 检查targetTime参数是否为空
		if (!targetTime) return 'targetTime参数不可为空';
		let timeStampFlag = 1
		// 检查 targetTime 是否为数字类型
		if (typeof targetTime === 'number') {
			// 检查 targetTime 是否为10或13位时间戳
			if ((targetTime + '').length !== 10 && (targetTime + '').length !== 13) return 'targetTime参数类型错误,应为10或13位时间戳';
			// 当前时间戳为秒级
			if (typeof targetTime === 'number' && (targetTime + '').length === 10) timeStampFlag = 1
			// 当前时间戳为毫秒级
			if (typeof targetTime === 'number' && (targetTime + '').length === 13) timeStampFlag = 1000
		}
		// 检查 targetTime 是否为字符串、 Date 对象
		if (typeof targetTime !== 'string' && !(targetTime instanceof Date)) {
			return 'targetTime参数类型错误,应为字符串、Date对象';
		}
		// 当前转化时间戳
		let now = new Date();
		// 传入参数转化时间戳
		let target = new Date(targetTime);
		// 检查日期是否合法
		if (isNaN(target)) return 'targetTime参数非法'; 
		// 单位数组
		let flagArr = ['天', '小时', '分钟'];
		// 时间差
		let diff = target - now;
		// 取时间差的绝对值
		let absDiff = Math.abs(diff); 
		// 用于存储计算时间差
		let differNum;
		// 如果时间差为0,返回"现在"
		if (diff === 0) return '现在';
		// 根据参数类型计算时间差
		if (flag === 0) {
			differNum = Math.floor(absDiff / (timeStampFlag * 60 * 60 * 24)); // 计算天数差
		} else if (flag === 1) {
			differNum = Math.floor(absDiff / (timeStampFlag * 60 * 60)); // 计算小时差
		} else if (flag === 2) {
			differNum = Math.floor(absDiff / (timeStampFlag * 60)); // 计算分钟差
		} else {
			// 如果flag不是0、1、2,返回错误提示
			return 'flag参数错误'; 
		}
		// 返回拼接字符
		return `${differNum}${diff > 0 ? `${flagArr[flag]}后` : `${flagArr[flag]}前`}`;
	}

	// 示例用法
	console.log(getDaysDifference('2025-2-18', 0)); // 24天前
	console.log(getDaysDifference('2026/1/1', 1)); // 7016小时后
	console.log(getDaysDifference('2025.3.12', 2)); // 3801分钟前
	console.log(getDaysDifference('非法参数 ', 0)); // 提示非法参数
	console.log(getDaysDifference(1231212, 0)); // 提示非法参数
	console.log(getDaysDifference(true, 0)); // 提示非法参数
相关推荐
_r0bin_2 小时前
前端面试准备-7
开发语言·前端·javascript·fetch·跨域·class
IT瘾君2 小时前
JavaWeb:前端工程化-Vue
前端·javascript·vue.js
zhang98800002 小时前
JavaScript 核心原理深度解析-不停留于表面的VUE等的使用!
开发语言·javascript·vue.js
potender2 小时前
前端框架Vue
前端·vue.js·前端框架
站在风口的猪11083 小时前
《前端面试题:CSS预处理器(Sass、Less等)》
前端·css·html·less·css3·sass·html5
程序员的世界你不懂3 小时前
(9)-Fiddler抓包-Fiddler如何设置捕获Https会话
前端·https·fiddler
MoFe13 小时前
【.net core】天地图坐标转换为高德地图坐标(WGS84 坐标转 GCJ02 坐标)
java·前端·.netcore
去旅行、在路上4 小时前
chrome使用手机调试触屏web
前端·chrome
Aphasia3114 小时前
模式验证库——zod
前端·react.js
lexiangqicheng5 小时前
es6+和css3新增的特性有哪些
前端·es6·css3