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

一、前言

用法

用于计算目标时间(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)); // 提示非法参数
相关推荐
编程猪猪侠19 分钟前
Tailwind CSS 自定义工具类与主题配置指南
前端·css
qhd吴飞23 分钟前
mybatis 差异更新法
java·前端·mybatis
YGY Webgis糕手之路1 小时前
OpenLayers 快速入门(九)Extent 介绍
前端·经验分享·笔记·vue·web
患得患失9491 小时前
【前端】【vueDevTools】使用 vueDevTools 插件并修改默认打开编辑器
前端·编辑器
ReturnTrue8681 小时前
Vue路由状态持久化方案,优雅实现记住表单历史搜索记录!
前端·vue.js
UncleKyrie1 小时前
一个浏览器插件帮你查看Figma设计稿代码图片和转码
前端
遂心_1 小时前
深入解析前后端分离中的 /api 设计:从路由到代理的完整指南
前端·javascript·api
你听得到111 小时前
Flutter - 手搓一个日历组件,集成单日选择、日期范围选择、国际化、农历和节气显示
前端·flutter·架构
风清云淡_A1 小时前
【REACT18.x】CRA+TS+ANTD5.X封装自定义的hooks复用业务功能
前端·react.js
@大迁世界1 小时前
第7章 React性能优化核心
前端·javascript·react.js·性能优化·前端框架