浏览代码

feat(format): 添加通用时间格式化工具,避免日期信息污染卡片

xieyong 5 天之前
父节点
当前提交
b86da7db20
共有 3 个文件被更改,包括 17 次插入16 次删除
  1. 1 8
      src/pages/attendance/index.vue
  2. 1 8
      src/pages/home/index.vue
  3. 15 0
      src/utils/format.js

+ 1 - 8
src/pages/attendance/index.vue

@@ -123,6 +123,7 @@ import {
   queryAttendanceRule,
 } from "@/api/attendance";
 import { getLocationWithFallback } from "@/utils/location";
+import { extractTime } from "@/utils/format";
 
 useAuthGuard();
 
@@ -141,14 +142,6 @@ const ruleStatus = ref('loading');
 const ruleBlockedReason = ref(''); // 不可打卡的具体原因:草稿 / 自然到期 / 停用
 const ruleToastShown = ref(false);
 
-// 后端返回的时间是 "2026-09-14 09:00:00" / ISO 等带日期的字符串,
-// 这里只展示 HH:MM,避免日期污染打卡记录
-function extractTime(value) {
-  if (value == null || value === "") return "";
-  const m = String(value).match(/(\d{1,2}:\d{2})(:\d{2})?/);
-  return m ? m[1] : String(value);
-}
-
 const monthLabel = computed(() => {
   const [y, m] = currentMonth.value.split("-");
   return `${y}年${Number(m)}月`;

+ 1 - 8
src/pages/home/index.vue

@@ -119,6 +119,7 @@ import {
   submitPunch,
 } from "@/api/attendance";
 import { getLocationWithFallback } from "@/utils/location";
+import { extractTime } from "@/utils/format";
 
 const pendingCount = ref(0);
 const currentUser = useCurrentUser();
@@ -175,14 +176,6 @@ const shiftText = computed(() => {
   return `${name} · ${extractTime(start)} - ${extractTime(end)}`;
 });
 
-// 后端返回的班次时间是 "2026-09-14 09:00:00" / ISO 等带日期的字符串,
-// 这里只展示 HH:MM,避免 2026-09-14 这种信息污染卡片
-function extractTime(value) {
-  if (value == null || value === "") return "";
-  const m = String(value).match(/(\d{1,2}:\d{2})(:\d{2})?/);
-  return m ? m[1] : String(value);
-}
-
 // 把 "18:00:00" / "2026-09-14 18:00:00" 这种班次时间解析为"今日该时刻"的 Date
 function parseShiftTime(value) {
   if (value == null || value === "") return null;

+ 15 - 0
src/utils/format.js

@@ -0,0 +1,15 @@
+// 通用格式化工具
+
+/**
+ * 把后端返回的 "2026-09-14 09:00:00" / ISO 等带日期的时间字符串
+ * 截成 "09:00" 这种 HH:MM 形式,避免日期信息污染卡片。
+ * - 空值返回空字符串
+ * - 无 HH:MM(:SS) 匹配时原样返回,避免静默吞错
+ * @param {string|null|undefined} value
+ * @returns {string}
+ */
+export function extractTime(value) {
+  if (value == null || value === "") return "";
+  const m = String(value).match(/(\d{1,2}:\d{2})(:\d{2})?/);
+  return m ? m[1] : String(value);
+}