dateUtil.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import dayjs from 'dayjs'
  2. import calendar from 'dayjs/plugin/calendar'
  3. import quarterOfYear from 'dayjs/plugin/quarterOfYear'
  4. import relativeTime from 'dayjs/plugin/relativeTime'
  5. import updateLocale from 'dayjs/plugin/updateLocale'
  6. import utc from 'dayjs/plugin/utc'
  7. import weekday from 'dayjs/plugin/weekday'
  8. import 'dayjs/locale/zh-cn'
  9. dayjs.extend(calendar)
  10. dayjs.extend(quarterOfYear)
  11. dayjs.extend(relativeTime)
  12. dayjs.extend(updateLocale)
  13. dayjs.extend(utc)
  14. dayjs.extend(weekday)
  15. dayjs.locale('zh-cn')
  16. dayjs.updateLocale('zh-cn', {
  17. calendar: {
  18. sameDay: 'HH:mm',
  19. nextDay: '[明天]',
  20. nextWeek: 'dddd',
  21. lastDay: '[昨天] HH:mm',
  22. lastWeek: 'dddd HH:mm',
  23. sameElse: 'YYYY年M月D日 HH:mm',
  24. },
  25. relativeTime: {
  26. future: '%s后',
  27. past: '%s前',
  28. s: '几秒',
  29. m: '1分钟',
  30. mm: '%d分钟',
  31. h: '1小时',
  32. hh: '%d小时',
  33. d: '1天',
  34. dd: '%d天',
  35. M: '1个月',
  36. MM: '%d个月',
  37. y: '1年',
  38. yy: '%d年',
  39. },
  40. })
  41. /** 时间工具 */
  42. export const dateUtil = dayjs
  43. export const DATETIME_FORMAT = 'YYYY-MM-DD HH:mm:ss'
  44. export const DATE_FORMAT = 'YYYY-MM-DD'
  45. export const TIME_FORMAT = 'HH:mm'
  46. /**
  47. * 格式化日期
  48. * @param _date 日期对象、时间戳或字符串
  49. * @param format 格式字符串
  50. * @returns 格式化后的日期字符串
  51. */
  52. function _format(_date: dayjs.ConfigType, format: string): string {
  53. if (!_date) {
  54. return _date as any
  55. }
  56. const date = dateUtil(_date)
  57. return date.isValid() ? date.format(format) : (_date as string)
  58. }
  59. /**
  60. * 格式化为日期时间字符串
  61. * @param date 日期对象、时间戳或字符串
  62. * @param format 格式字符串,默认为 DATETIME_FORMAT
  63. * @returns 格式化后的日期时间字符串
  64. */
  65. export function formatToDatetime(date: dayjs.ConfigType = undefined, format: string = DATETIME_FORMAT): string {
  66. return _format(date, format)
  67. }
  68. /**
  69. * 格式化为日期字符串
  70. * @param date 日期对象、时间戳或字符串
  71. * @param format 格式字符串,默认为 DATE_FORMAT
  72. * @returns 格式化后的日期字符串
  73. */
  74. export function formatToDate(date: dayjs.ConfigType = undefined, format: string = DATE_FORMAT): string {
  75. return _format(date, format)
  76. }
  77. /**
  78. * 格式化为日期字符串
  79. * @param date 日期对象、时间戳或字符串
  80. * @param format 格式字符串,默认为 TIME_FORMAT
  81. * @returns 格式化后的日期字符串
  82. */
  83. export function formatToTime(date: dayjs.ConfigType = undefined, format: string = TIME_FORMAT): string {
  84. return _format(date, format)
  85. }
  86. /**
  87. * 时间人性化显示
  88. * @param date 要格式化的日期
  89. * @param oppositeDate 参考日期,默认为当前时间
  90. * @returns 人性化的时间字符串
  91. */
  92. export function humanizedDate(date: dayjs.ConfigType, oppositeDate: dayjs.ConfigType = undefined): string {
  93. if (!date || !dateUtil(date).isValid()) {
  94. return ''
  95. }
  96. const now = oppositeDate ? dateUtil(oppositeDate) : dateUtil()
  97. const diffSeconds = now.diff(date, 'second')
  98. const diffMinutes = now.diff(date, 'minute')
  99. const diffHours = now.diff(date, 'hour')
  100. const diffDays = now.diff(date, 'day')
  101. if (diffSeconds < 60) {
  102. return `${diffSeconds}秒前`
  103. }
  104. else if (diffMinutes < 60) {
  105. return `${diffMinutes}分钟前`
  106. }
  107. else if (diffHours < 24) {
  108. return `${diffHours}小时前`
  109. }
  110. else if (diffDays < 7) {
  111. return `${diffDays}天前`
  112. }
  113. else {
  114. return formatToDatetime(date)
  115. }
  116. }
  117. /**
  118. * 获取时辰问候语
  119. * @returns 根据当前时间返回相应的问候语
  120. */
  121. export function getGreeting(): string {
  122. const currentHour = dateUtil().hour()
  123. if (currentHour >= 5 && currentHour < 12) {
  124. return '早上好'
  125. }
  126. else if (currentHour >= 12 && currentHour < 14) {
  127. return '中午好'
  128. }
  129. else if (currentHour >= 14 && currentHour < 18) {
  130. return '下午好'
  131. }
  132. else if (currentHour >= 18 && currentHour < 24) {
  133. return '晚上好'
  134. }
  135. else {
  136. return '深夜了'
  137. }
  138. }