formatDate.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // 日期格式化函数
  2. export function formatDate(date, fmt = 'YYYY-MM-DD HH:mm:ss') {
  3. if (!date) return ''
  4. // 关键修复:对日期字符串进行兼容性处理
  5. let parsedDate
  6. if (typeof date === 'string') {
  7. // 处理标准日期时间字符串: 将 "-" 替换为 "/" 以提高iOS兼容性
  8. // 同时处理可能存在的 "T" 分隔符和时区信息
  9. date = date.replace(/-/g, '/').replace('T', ' ').split('.')[0]
  10. // 对于可能是数字字符串的情况(如时间戳),尝试转换为数字
  11. if (/^\d+$/.test(date)) {
  12. parsedDate = new Date(parseInt(date))
  13. } else {
  14. parsedDate = new Date(date)
  15. }
  16. } else if (typeof date === 'number') {
  17. // 如果传入的是数字时间戳,确保是毫秒级
  18. parsedDate = new Date(date < 10000000000 ? date * 1000 : date)
  19. } else {
  20. // 其他情况(如已经是Date对象)
  21. parsedDate = new Date(date)
  22. }
  23. // 检查日期是否有效
  24. if (isNaN(parsedDate.getTime())) {
  25. console.warn('Invalid date:', date)
  26. return 'Invalid Date'
  27. }
  28. const d = parsedDate
  29. const padZero = num => (num < 10 ? `0${num}` : num)
  30. const map = {
  31. 'YYYY': d.getFullYear(),
  32. 'MM': padZero(d.getMonth() + 1),
  33. 'DD': padZero(d.getDate()),
  34. 'HH': padZero(d.getHours()),
  35. 'mm': padZero(d.getMinutes()),
  36. 'ss': padZero(d.getSeconds())
  37. }
  38. return fmt.replace(/(YYYY|MM|DD|HH|mm|ss)/g, match => map[match])
  39. }
  40. // 相对时间计算
  41. export function relativeTime(date) {
  42. const now = new Date()
  43. const diff = now - new Date(date)
  44. const minute = 60 * 1000
  45. const hour = minute * 60
  46. const day = hour * 24
  47. if (diff < minute) return '刚刚'
  48. if (diff < hour) return `${Math.floor(diff/minute)}分钟前`
  49. if (diff < day) return `${Math.floor(diff/hour)}小时前`
  50. return formatDate(date, 'YYYY-MM-DD')
  51. }