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

一、前言

用法

用于计算目标时间(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)); // 提示非法参数
相关推荐
augenstern4166 分钟前
webpack重构优化
前端·webpack·重构
海拥✘10 分钟前
CodeBuddy终极测评:中国版Cursor的开发革命(含安装指南+HTML游戏实战)
前端·游戏·html
寧笙(Lycode)40 分钟前
React系列——HOC高阶组件的封装与使用
前端·react.js·前端框架
asqq842 分钟前
CSS 中的 ::before 和 ::after 伪元素
前端·css
拖孩1 小时前
【Nova UI】十五、打造组件库之滚动条组件(上):滚动条组件的起步与进阶
前端·javascript·css·vue.js·ui组件库
苹果电脑的鑫鑫1 小时前
element中表格文字剧中可以使用的属性
javascript·vue.js·elementui
Hejjon1 小时前
Vue2 elementUI 二次封装命令式表单弹框组件
前端·vue.js
一丝晨光2 小时前
数值溢出保护?数值溢出应该是多少?Swift如何让整数计算溢出不抛出异常?类型最大值和最小值?
java·javascript·c++·rust·go·c·swift
小堃学编程2 小时前
前端学习(3)—— CSS实现热搜榜
前端·学习
Wannaer2 小时前
从 Vue3 回望 Vue2:响应式的内核革命
前端·javascript·vue.js