date.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*
  2. * 时间格式化函数(将时间格式化为,2019年08月12日,2019-08-12,2019/08/12的形式)
  3. * pattern参数(想要什么格式的数据就传入什么格式的数据)
  4. * · 'yyyy-MM-dd' ---> 输出如2019-09-20
  5. * · 'yyyy-MM-dd HH:mm' ---> 输出如2019-09-20 18:20
  6. * · 'yyyy-MM-dd HH:mm:ss' ---> 输出如2019-09-20 06:20:23
  7. * · 'yyyy/MM/dd' ---> 输出如2019/09/20
  8. * · 'yyyy年MM月dd日' ---> 输出如2019年09月20日
  9. * · 'yyyy年MM月dd日 HH时mm分' ---> 输出如2019年09月20日 18时20分
  10. * · 'yyyy年MM月dd日 HH时mm分ss秒' ---> 输出如2019年09月20日 18时20分23秒
  11. * · 'yyyy年MM月dd日 HH时mm分ss秒 EE' ---> 输出如2019年09月20日 18时20分23秒 周二
  12. * · 'yyyy年MM月dd日 HH时mm分ss秒 EEE' ---> 输出如2019年09月20日 18时20分23秒 星期二
  13. * 参考: https://www.cnblogs.com/mr-wuxiansheng/p/6296646.html
  14. */
  15. export function dateFormatter(date = '', fmt = 'yyyy-MM-dd HH:mm:ss') {
  16. // 将传入的date转为时间对象
  17. if (!date) return ''
  18. // 处理ios不兼容'2022-6-6'类似的'-'问题
  19. if (typeof data === 'string') {
  20. date = date.replace(/-/g, '/')
  21. }
  22. date = new Date(date)
  23. const o = {
  24. 'y+': date.getFullYear(),
  25. 'M+': date.getMonth() + 1, // 月份
  26. 'd+': date.getDate(), // 日
  27. // 12小时制
  28. 'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 小时
  29. // 24小时制
  30. 'H+': date.getHours(), // 小时
  31. 'm+': date.getMinutes(), // 分
  32. 's+': date.getSeconds(), // 秒
  33. 'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
  34. S: date.getMilliseconds(), // 毫秒
  35. 'E+': date.getDay() // 周
  36. }
  37. const week = ['日', '一', '二', '三', '四', '五', '六']
  38. if (/(y+)/.test(fmt)) {
  39. fmt = fmt.replace(
  40. RegExp.$1,
  41. (date.getFullYear() + '').substr(4 - RegExp.$1.length)
  42. )
  43. }
  44. if (/(E+)/.test(fmt)) {
  45. fmt = fmt.replace(
  46. RegExp.$1,
  47. (RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' : '周') : '') +
  48. week[date.getDay()]
  49. )
  50. }
  51. for (const k in o) {
  52. if (new RegExp('(' + k + ')').test(fmt)) {
  53. fmt = fmt.replace(
  54. RegExp.$1,
  55. RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
  56. )
  57. }
  58. }
  59. return fmt
  60. }
  61. // 时间戳转换 多少秒、多少分、多少小时前、多少天前 超出10天显示年月日
  62. // 传入一个时间戳
  63. export function dateFromNow(originTime, useOld = false) {
  64. if (!originTime) return
  65. // 原始时间 - 传入的时间戳
  66. const originTimeStamp = +new Date(originTime)
  67. // 当前时间戳
  68. const nowTimeStamp = +new Date()
  69. // 时间戳相差多少
  70. const diffTimeStamp = nowTimeStamp - originTimeStamp
  71. const postfix = diffTimeStamp > 0 ? '前' : '后'
  72. // 求绝对值 ms(毫秒)
  73. const diffTimeStampAbsMs = Math.abs(diffTimeStamp)
  74. const diffTimeStampAbsS = Math.round(diffTimeStampAbsMs / 1000)
  75. // 10天的秒数
  76. const days11 = 11 * 24 * 60 * 60
  77. const dataMap = {
  78. zh: ['天', '小时', '分钟', '秒'],
  79. number: [24 * 60 * 60, 60 * 60, 60, 1]
  80. }
  81. let timeString = ''
  82. // 10天前
  83. const tenDaysAgo = diffTimeStampAbsS > days11
  84. // 是否是当天
  85. const isCurrentDay =
  86. dateFormatter(originTimeStamp, 'yyyy.MM.dd') ===
  87. dateFormatter(nowTimeStamp, 'yyyy.MM.dd')
  88. let condition = !isCurrentDay
  89. if (useOld) {
  90. condition = tenDaysAgo
  91. }
  92. if (condition) {
  93. // 不是当天,则使用正常日期显示
  94. const originDate = new Date(originTimeStamp)
  95. const nowDate = new Date()
  96. // 是否同年
  97. const sameYear = originDate.getFullYear() === nowDate.getFullYear()
  98. // 如果是当年,则不显示年
  99. const patternString = sameYear ? 'MM-dd' : 'yyyy-MM-dd'
  100. timeString = dateFormatter(originDate, patternString)
  101. } else {
  102. for (let i = 0; i < dataMap.number.length; i++) {
  103. const inm = Math.floor(diffTimeStampAbsS / dataMap.number[i])
  104. if (inm !== 0) {
  105. timeString = inm + dataMap.zh[i] + postfix
  106. break
  107. }
  108. }
  109. }
  110. return timeString
  111. }