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

一、前言

用法

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

参数说明
  1. targetTime:

    • 类型:string、number 或 Date 对象。

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

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

  2. flag:

    • 类型:number。

    • 描述:用于指定返回的时间差单位,取值范围为 0、1 或 2:

      • 0:返回天数差。
      • 1:返回小时数差。
      • 2:返回分钟数差。
    • 注意:如果 flag 不是 0、1 或 2,方法会返回 '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)); // 提示非法参数
相关推荐
weixin_4482902534 分钟前
书庐开发实战教学
javascript·css·html
默_笙40 分钟前
🛴 从散件到整机:DeepAgents 与 Agent 身上预留的那些"插槽"(前置介绍)
前端·javascript
zhangzeyuaaa1 小时前
深入理解 Ruby 运算符:本质、分类、坑点与重载实战
开发语言·前端·ruby
一木 之林1 小时前
DeepSeek Agent 开发(一)
开发语言·前端·javascript
树下水月2 小时前
Typora破解
linux·服务器·前端
用户5508492902562 小时前
CSS布局实战:从Flex到Grid的完整避坑指南
前端
用户5508492902562 小时前
前端接口请求层怎么封装?一个可落地的请求方案
前端
MetWeave3 小时前
跟着一条 SPECI 走流水线:从电报到界面
前端
樱花落木兰3 小时前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
Helix2503 小时前
Chrome 开发者工具进阶:长截图、网络调试与性能分析
前端·chrome·chrome devtools·使用技巧·性能分析·开发者工具·长截图