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

一、前言

用法

用于计算目标时间(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)); // 提示非法参数
相关推荐
半点寒12W26 分钟前
微信小程序实现路由拦截的方法
前端
某公司摸鱼前端1 小时前
uniapp socket 封装 (可拿去直接用)
前端·javascript·websocket·uni-app
要加油哦~1 小时前
vue | 插件 | 移动文件的插件 —— move-file-cli 插件 的安装与使用
前端·javascript·vue.js
小林学习编程1 小时前
Springboot + vue + uni-app小程序web端全套家具商场
前端·vue.js·spring boot
柳鲲鹏1 小时前
WINDOWS最快布署WEB服务器:apache2
服务器·前端·windows
weixin-a153003083162 小时前
【playwright篇】教程(十七)[html元素知识]
java·前端·html
ai小鬼头3 小时前
AIStarter最新版怎么卸载AI项目?一键删除操作指南(附路径设置技巧)
前端·后端·github
wen's3 小时前
React Native 0.79.4 中 [RCTView setColor:] 崩溃问题完整解决方案
javascript·react native·react.js
一只叫煤球的猫4 小时前
普通程序员,从开发到管理岗,为什么我越升职越痛苦?
前端·后端·全栈
vvilkim4 小时前
Electron 自动更新机制详解:实现无缝应用升级
前端·javascript·electron