From 089bf5d2378b3c4a61d795b2a92bede2c193b771 Mon Sep 17 00:00:00 2001
From: admin <344137771@qq.com>
Date: Tue, 06 Jan 2026 11:22:58 +0800
Subject: [PATCH] 1

---
 src/utils/date.js |  144 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 144 insertions(+), 0 deletions(-)

diff --git a/src/utils/date.js b/src/utils/date.js
new file mode 100644
index 0000000..c85b789
--- /dev/null
+++ b/src/utils/date.js
@@ -0,0 +1,144 @@
+/**
+ * 对Date的扩展,将 Date 转化为指定格式的String。
+ *
+ *  月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
+ *  年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)。
+ *
+ *  【示例】:
+ *  formatDate(new Date(), 'yyyy-MM-dd hh:mm:ss.S') ==> 2006-07-02 08:09:04.423
+ *  formatDate(new Date(), 'yyyy-M-d h:m:s.S')      ==> 2006-7-2 8:9:4.18
+ *  formatDate(new Date(), 'hh:mm:ss.S')            ==> 08:09:04.423
+ */
+export function formatDate(date, fmt) {
+  const o = {
+    'M+': date.getMonth() + 1, //月份
+    'd+': date.getDate(), //日
+    'h+': date.getHours(), //小时
+    'm+': date.getMinutes(), //分
+    's+': date.getSeconds(), //秒
+    'q+': Math.floor((date.getMonth() + 3) / 3), //季度
+    S: date.getMilliseconds(), //毫秒
+  }
+
+  if (/(y+)/.test(fmt)) {
+    fmt = fmt.replace(
+      RegExp.$1,
+      (date.getFullYear() + '').substr(4 - RegExp.$1.length)
+    )
+  }
+
+  for (let k in o) {
+    if (new RegExp('(' + k + ')').test(fmt)) {
+      let value =
+        RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
+      fmt = fmt.replace(RegExp.$1, value)
+    }
+  }
+
+  return fmt
+}
+
+/**
+ * 仿照微信中的消息时间显示逻辑,将时间戳(单位:毫秒)转换为友好的显示格式.
+ *
+ * 1)7天之内的日期显示逻辑是:今天、昨天(-1d)、前天(-2d)、星期?(只显示总计7天之内的星期数,即<=-4d);
+ * 2)7天之外(即>7天)的逻辑:直接显示完整日期时间。
+ *
+ * @param {[long]} timestamp 时间戳(单位:毫秒),形如:1550789954260
+ * @param {boolean} mustIncludeTime true表示输出的格式里一定会包含“时间:分钟”
+ * ,否则不包含(参考微信,不包含时分的情况,用于首页“消息”中显示时)
+ *
+ * @return {string} 输出格式形如:“刚刚”、“10:30”、“昨天 12:04”、“前天 20:51”、“星期二”、“2019/2/21 12:09”等形式
+ */
+export function formatDateShort(timestamp, mustIncludeTime) {
+  // 当前时间
+  let currentDate = new Date()
+  // 目标判断时间
+  let srcDate = new Date(parseInt(timestamp))
+
+  let currentYear = currentDate.getFullYear()
+  let currentMonth = currentDate.getMonth() + 1
+  let currentDateD = currentDate.getDate()
+
+  let srcYear = srcDate.getFullYear()
+  let srcMonth = srcDate.getMonth() + 1
+  let srcDateD = srcDate.getDate()
+
+  let ret = ''
+
+  // 要额外显示的时间分钟
+  let timeExtraStr = mustIncludeTime ? ' ' + formatDate(srcDate, 'hh:mm') : ''
+
+  // 当年
+  if (currentYear == srcYear) {
+    let currentTimestamp = currentDate.getTime()
+    let srcTimestamp = timestamp
+    // 相差时间(单位:毫秒)
+    let deltaTime = currentTimestamp - srcTimestamp
+
+    // 当天(月份和日期一致才是)
+    if (currentMonth == srcMonth && currentDateD == srcDateD) {
+      // 时间相差60秒以内
+      if (deltaTime < 60 * 1000) ret = '刚刚'
+      // 否则当天其它时间段的,直接显示“时:分”的形式
+      else ret = formatDate(srcDate, 'hh:mm')
+    }
+    // 当年 && 当天之外的时间(即昨天及以前的时间)
+    else {
+      // 昨天(以“现在”的时候为基准-1天)
+      let yesterdayDate = new Date()
+      yesterdayDate.setDate(yesterdayDate.getDate() - 1)
+
+      // 前天(以“现在”的时候为基准-2天)
+      let beforeYesterdayDate = new Date()
+      beforeYesterdayDate.setDate(beforeYesterdayDate.getDate() - 2)
+
+      // 用目标日期的“月”和“天”跟上方计算出来的“昨天”进行比较,是最为准确的(如果用时间戳差值
+      // 的形式,是不准确的,比如:现在时刻是2019年02月22日1:00、而srcDate是2019年02月21日23:00,
+      // 这两者间只相差2小时,直接用“deltaTime/(3600 * 1000)” > 24小时来判断是否昨天,就完全是扯蛋的逻辑了)
+      if (
+        srcMonth == yesterdayDate.getMonth() + 1 &&
+        srcDateD == yesterdayDate.getDate()
+      )
+        ret = '昨天' + timeExtraStr
+      // -1d
+      // “前天”判断逻辑同上
+      else if (
+        srcMonth == beforeYesterdayDate.getMonth() + 1 &&
+        srcDateD == beforeYesterdayDate.getDate()
+      )
+        ret = '前天' + timeExtraStr
+      // -2d
+      else {
+        // 跟当前时间相差的小时数
+        let deltaHour = deltaTime / (3600 * 1000)
+
+        // 如果小于或等 7*24小时就显示星期几
+        if (deltaHour <= 7 * 24) {
+          let weekday = new Array(7)
+          weekday[0] = '星期日'
+          weekday[1] = '星期一'
+          weekday[2] = '星期二'
+          weekday[3] = '星期三'
+          weekday[4] = '星期四'
+          weekday[5] = '星期五'
+          weekday[6] = '星期六'
+
+          // 取出当前是星期几
+          let weedayDesc = weekday[srcDate.getDay()]
+          ret = weedayDesc + timeExtraStr
+        }
+        // 否则直接显示完整日期时间
+        else {
+          ret = formatDate(srcDate, 'yyyy/M/d') + timeExtraStr
+        }
+      }
+    }
+  }
+  // 往年
+  else {
+    ret = formatDate(srcDate, 'yyyy/M/d') + timeExtraStr
+  }
+
+  return ret
+}

--
Gitblit v1.9.3