/** 日期格式化 YYYY-MM-DD */ export const formatDate = date => { const d = new Date(date) const year = d.getFullYear() const month = String(d.getMonth() + 1).padStart(2, '0') // 月份从0开始 const day = String(d.getDate()).padStart(2, '0') return `${year}-${month}-${day}` } /** 日期格式化:月.日 */ export const formatMonthDay = date => { // 统一处理为 Date 对象 const d = new Date(date) // 检查是否是有效日期 if (isNaN(d.getTime())) { console.error('Invalid date:', date) return '--.--' } const month = String(d.getMonth() + 1).padStart(2, '0') // getMonth() 是 0-11 const day = String(d.getDate()).padStart(2, '0') return `${month}.${day}` } /** * 将时间字符串转换为相对时间描述 * @param {string} timeStr - 后端返回的时间字符串,如 '2026-01-12 22:51:54' * @returns {string} 相对时间描述,如 '刚刚'、'3分钟前'、'昨天' 等 */ export function formatRelativeTime(timeStr) { // 兼容 iOS 不支持 '-' 分隔的日期格式,需转为标准 ISO 格式 const normalizedTimeStr = timeStr.replace(/-/g, '/') const serverTime = new Date(normalizedTimeStr) const now = new Date() // 时间差(毫秒) const diffMs = now - serverTime // 如果时间在未来,直接返回原始时间或处理异常 if (diffMs < 0) { return timeStr // 或者 return '未来时间'; } const seconds = Math.floor(diffMs / 1000) const minutes = Math.floor(seconds / 60) const hours = Math.floor(minutes / 60) const days = Math.floor(hours / 24) // 判断是否是今天 const isSameDay = (date1, date2) => { return ( date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth() && date1.getDate() === date2.getDate() ) } // 判断是否是昨天 const isYesterday = (date1, date2) => { const yesterday = new Date(date2) yesterday.setDate(date2.getDate() - 1) return isSameDay(date1, yesterday) } if (seconds < 60) { return '刚刚' } else if (minutes < 60) { return `${minutes}分钟前` } else if (hours < 24 && isSameDay(serverTime, now)) { return `${hours}小时前` } else if (isYesterday(serverTime, now)) { return '昨天' } else if (days < 7) { return `${days}天前` } else { // 超过一周,返回原始日期(可选格式化为 YYYY-MM-DD) return timeStr.split(' ')[0] // 或使用更美观的格式 } } /** * 获取天,时,分,秒 * @param {*} dateTimeStr * @returns */ export const parseDateTime = dateTimeStr => { const date = new Date(dateTimeStr) // 检查日期是否有效 if (isNaN(date.getTime())) { throw new Error('Invalid date string') } return { day: date.getDate(), // 月份中的第几天(1-31) hour: date.getHours(), // 小时(0-23) minute: date.getMinutes(), // 分钟(0-59) second: date.getSeconds() // 秒(0-59) } } export const getRemainingTime = endTimeStr => { const now = new Date().getTime() // 当前时间戳(毫秒) const end = new Date(endTimeStr.replace(' ', 'T')).getTime() // 转为 ISO 格式并获取时间戳 if (isNaN(end)) { throw new Error('无效的结束时间格式') } const diff = end - now // 剩余毫秒数 if (diff <= 0) { return { day: 0, hour: 0, minute: 0, second: 0, isExpired: true } } const totalSeconds = Math.floor(diff / 1000) const day = Math.floor(totalSeconds / (24 * 3600)) const hour = Math.floor((totalSeconds % (24 * 3600)) / 3600) const minute = Math.floor((totalSeconds % 3600) / 60) const second = totalSeconds % 60 return { day, hour, minute, second, isExpired: false } }