| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import dayjs from 'dayjs' |
| | | |
| | | // ==================================================================== |
| | | // IM æ¶é´æ ¼å¼å |
| | | // ==================================================================== |
| | | // 4 ç±»åºæ¯ï¼ææ¡è§ååæå·®å¼ï¼ç»ä¸èµ° dayjsï¼é¿å
raw Date æ£ç¹åæ³ |
| | | |
| | | const WEEKDAY_NAMES_FULL = ['æææ¥', 'ææä¸', 'ææäº', 'ææä¸', 'ææå', 'ææäº', 'ææå
'] |
| | | const WEEKDAY_NAMES_SHORT = ['卿¥', 'å¨ä¸', 'å¨äº', 'å¨ä¸', 'å¨å', 'å¨äº', 'å¨å
'] |
| | | |
| | | /** |
| | | * æ¶æ¯åè¡¨çæ¶é´åéæ¡ |
| | | * |
| | | * - ä»å¤©ï¼HH:mm |
| | | * - æ¨å¤©ï¼æ¨å¤© HH:mm |
| | | * - ä¸å¨å
ï¼å¨X HH:mm |
| | | * - è¶
è¿ä¸å¨ï¼MM-DD HH:mm |
| | | */ |
| | | export function formatTimeTip(timestamp: number): string { |
| | | if (!timestamp) { |
| | | return '' |
| | | } |
| | | const target = dayjs(timestamp) |
| | | const now = dayjs() |
| | | const time = target.format('HH:mm') |
| | | if (target.isSame(now, 'day')) { |
| | | return time |
| | | } |
| | | if (target.isSame(now.subtract(1, 'day'), 'day')) { |
| | | return `æ¨å¤© ${time}` |
| | | } |
| | | const diffDays = now.startOf('day').diff(target.startOf('day'), 'day') |
| | | if (diffDays >= 2 && diffDays <= 6) { |
| | | return `${WEEKDAY_NAMES_SHORT[target.day()]} ${time}` |
| | | } |
| | | return target.format('MM-DD HH:mm') |
| | | } |
| | | |
| | | /** |
| | | * ä¼è¯å表éçæ¶é´ï¼æ HH:mm åç¼ï¼åªå±ç¤ºæ¥æç²åº¦ï¼ |
| | | * |
| | | * - ä»å¤©ï¼HH:mm |
| | | * - æ¨å¤©ï¼æ¨å¤© HH:mm |
| | | * - æ¬å¨å
ï¼2-6 天åï¼ï¼ææX |
| | | * - åå¹´å
¶ä»ï¼MM/DD |
| | | * - 跨年ï¼YYYY/MM/DD |
| | | */ |
| | | export function formatConversationTime(timestamp: number): string { |
| | | if (!timestamp) { |
| | | return '' |
| | | } |
| | | const target = dayjs(timestamp) |
| | | const now = dayjs() |
| | | if (target.isSame(now, 'day')) { |
| | | return target.format('HH:mm') |
| | | } |
| | | if (target.isSame(now.subtract(1, 'day'), 'day')) { |
| | | return `æ¨å¤© ${target.format('HH:mm')}` |
| | | } |
| | | // ç¨ startOf('day') å
åºè·¨æ¶é´ç¹çå·®å¼ï¼é¿å
æ¥è¿åæ¨æ¶åå° 1.x â diff ç®æ 1 æ¼ææ¨å¤©åæ¯ |
| | | const diffDays = now.startOf('day').diff(target.startOf('day'), 'day') |
| | | if (diffDays >= 2 && diffDays <= 6) { |
| | | return WEEKDAY_NAMES_FULL[target.day()] || '' |
| | | } |
| | | return target.year() === now.year() ? target.format('MM/DD') : target.format('YYYY/MM/DD') |
| | | } |
| | | |
| | | /** |
| | | * å岿¶æ¯æç´¢åè¡¨çæ¶é´ï¼å±ç¤ºç»å¯¹æ¥æ |
| | | * |
| | | * - åå¹´ï¼MæDæ¥ HH:mm |
| | | * - 跨年ï¼YYYYå¹´MæDæ¥ HH:mm |
| | | */ |
| | | export function formatHistoryTime(timestamp: number): string { |
| | | if (!timestamp) { |
| | | return '' |
| | | } |
| | | const target = dayjs(timestamp) |
| | | return target.year() === dayjs().year() |
| | | ? target.format('MæDæ¥ HH:mm') |
| | | : target.format('YYYYå¹´MæDæ¥ HH:mm') |
| | | } |
| | | |
| | | /** åå¹¶æ¶æ¯è¯¦æ
åè¡¨éæ¯è¡çæ¶é´ï¼MM-DD HH:mm */ |
| | | export function formatMergeItemTime(timestamp: number): string { |
| | | if (!timestamp) { |
| | | return '' |
| | | } |
| | | return dayjs(timestamp).format('MM-DD HH:mm') |
| | | } |
| | | |
| | | /** RTC éè¯æ¶é¿ï¼ç§ï¼â "00:06" / "1:23:45" */ |
| | | export function formatCallDuration(seconds: number | undefined): string { |
| | | const total = Math.max(0, Math.floor(seconds || 0)) |
| | | const h = Math.floor(total / 3600) |
| | | const m = Math.floor((total % 3600) / 60) |
| | | const s = total % 60 |
| | | const pad = (n: number) => String(n).padStart(2, '0') |
| | | return h > 0 ? `${h}:${pad(m)}:${pad(s)}` : `${pad(m)}:${pad(s)}` |
| | | } |
| | | |
| | | /** ç§æ°æ ¼å¼å为 mm:ss */ |
| | | export function formatSeconds(seconds?: number): string { |
| | | const value = Math.max(0, Number(seconds || 0)) |
| | | const minute = Math.floor(value / 60) |
| | | const second = Math.floor(value % 60) |
| | | return `${minute.toString().padStart(2, '0')}:${second.toString().padStart(2, '0')}` |
| | | } |
| | | |
| | | /** æ ¼å¼åæ¥æ */ |
| | | export function formatDate( |
| | | date?: Date | number | string, |
| | | format = 'YYYY-MM-DD HH:mm:ss' |
| | | ) { |
| | | return dayjs(date).format(format) |
| | | } |
| | | |
| | | /** æ¥éå°ç»æçéè¯æ¶é¿ï¼ä»»ä¸æ¶é´ç¼ºå¤±è¿å '-' */ |
| | | export function resolveCallDuration( |
| | | acceptTime: Date | string | undefined, |
| | | endTime: Date | string | undefined |
| | | ): string { |
| | | if (!acceptTime || !endTime) { |
| | | return '-' |
| | | } |
| | | const seconds = Math.floor((new Date(endTime).getTime() - new Date(acceptTime).getTime()) / 1000) |
| | | return seconds > 0 ? formatCallDuration(seconds) : '-' |
| | | } |