formatTime.ts 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. import dayjs from 'dayjs'
  2. import type { TableColumnCtx } from 'element-plus'
  3. /**
  4. * 日期快捷选项适用于 el-date-picker
  5. */
  6. export const defaultShortcuts = [
  7. {
  8. text: '今天',
  9. value: () => {
  10. return new Date()
  11. }
  12. },
  13. {
  14. text: '昨天',
  15. value: () => {
  16. const date = new Date()
  17. date.setTime(date.getTime() - 3600 * 1000 * 24)
  18. return [date, date]
  19. }
  20. },
  21. {
  22. text: '最近七天',
  23. value: () => {
  24. const date = new Date()
  25. date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)
  26. return [date, new Date()]
  27. }
  28. },
  29. {
  30. text: '最近 30 天',
  31. value: () => {
  32. const date = new Date()
  33. date.setTime(date.getTime() - 3600 * 1000 * 24 * 30)
  34. return [date, new Date()]
  35. }
  36. },
  37. {
  38. text: '本月',
  39. value: () => {
  40. const date = new Date()
  41. date.setDate(1) // 设置为当前月的第一天
  42. return [date, new Date()]
  43. }
  44. },
  45. {
  46. text: '今年',
  47. value: () => {
  48. const date = new Date()
  49. return [new Date(`${date.getFullYear()}-01-01`), date]
  50. }
  51. }
  52. ]
  53. /**
  54. * 时间日期转换
  55. * @param date 当前时间,new Date() 格式
  56. * @param format 需要转换的时间格式字符串
  57. * @description format 字符串随意,如 `YYYY-mm、YYYY-mm-dd`
  58. * @description format 季度:"YYYY-mm-dd HH:MM:SS QQQQ"
  59. * @description format 星期:"YYYY-mm-dd HH:MM:SS WWW"
  60. * @description format 几周:"YYYY-mm-dd HH:MM:SS ZZZ"
  61. * @description format 季度 + 星期 + 几周:"YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ"
  62. * @returns 返回拼接后的时间字符串
  63. */
  64. export function formatDate(date: Date, format?: string): string {
  65. // 日期不存在,则返回空
  66. if (!date) {
  67. return ''
  68. }
  69. // 日期存在,则进行格式化
  70. return date ? dayjs(date).format(format ?? 'YYYY-MM-DD HH:mm:ss') : ''
  71. }
  72. /**
  73. * 获取当前的日期+时间
  74. */
  75. export function getNowDateTime() {
  76. return dayjs()
  77. }
  78. /**
  79. * 获取当前日期是第几周
  80. * @param dateTime 当前传入的日期值
  81. * @returns 返回第几周数字值
  82. */
  83. export function getWeek(dateTime: Date): number {
  84. const temptTime = new Date(dateTime.getTime())
  85. // 周几
  86. const weekday = temptTime.getDay() || 7
  87. // 周1+5天=周六
  88. temptTime.setDate(temptTime.getDate() - weekday + 1 + 5)
  89. let firstDay = new Date(temptTime.getFullYear(), 0, 1)
  90. const dayOfWeek = firstDay.getDay()
  91. let spendDay = 1
  92. if (dayOfWeek != 0) spendDay = 7 - dayOfWeek + 1
  93. firstDay = new Date(temptTime.getFullYear(), 0, 1 + spendDay)
  94. const d = Math.ceil((temptTime.valueOf() - firstDay.valueOf()) / 86400000)
  95. return Math.ceil(d / 7)
  96. }
  97. /**
  98. * 将时间转换为 `几秒前`、`几分钟前`、`几小时前`、`几天前`
  99. * @param param 当前时间,new Date() 格式或者字符串时间格式
  100. * @param format 需要转换的时间格式字符串
  101. * @description param 10秒: 10 * 1000
  102. * @description param 1分: 60 * 1000
  103. * @description param 1小时: 60 * 60 * 1000
  104. * @description param 24小时:60 * 60 * 24 * 1000
  105. * @description param 3天: 60 * 60* 24 * 1000 * 3
  106. * @returns 返回拼接后的时间字符串
  107. */
  108. export function formatPast(param: string | Date, format = 'YYYY-mm-dd HH:MM:SS'): string {
  109. // 传入格式处理、存储转换值
  110. let t: any, s: number
  111. // 获取js 时间戳
  112. let time: number = new Date().getTime()
  113. // 是否是对象
  114. typeof param === 'string' || 'object' ? (t = new Date(param).getTime()) : (t = param)
  115. // 当前时间戳 - 传入时间戳
  116. time = Number.parseInt(`${time - t}`)
  117. if (time < 10000) {
  118. // 10秒内
  119. return '刚刚'
  120. } else if (time < 60000 && time >= 10000) {
  121. // 超过10秒少于1分钟内
  122. s = Math.floor(time / 1000)
  123. return `${s}秒前`
  124. } else if (time < 3600000 && time >= 60000) {
  125. // 超过1分钟少于1小时
  126. s = Math.floor(time / 60000)
  127. return `${s}分钟前`
  128. } else if (time < 86400000 && time >= 3600000) {
  129. // 超过1小时少于24小时
  130. s = Math.floor(time / 3600000)
  131. return `${s}小时前`
  132. } else if (time < 259200000 && time >= 86400000) {
  133. // 超过1天少于3天内
  134. s = Math.floor(time / 86400000)
  135. return `${s}天前`
  136. } else {
  137. // 超过3天
  138. const date = typeof param === 'string' || 'object' ? new Date(param) : param
  139. return formatDate(date, format)
  140. }
  141. }
  142. /**
  143. * 时间问候语
  144. * @param param 当前时间,new Date() 格式
  145. * @description param 调用 `formatAxis(new Date())` 输出 `上午好`
  146. * @returns 返回拼接后的时间字符串
  147. */
  148. export function formatAxis(param: Date): string {
  149. const hour: number = new Date(param).getHours()
  150. if (hour < 6) return '凌晨好'
  151. else if (hour < 9) return '早上好'
  152. else if (hour < 12) return '上午好'
  153. else if (hour < 14) return '中午好'
  154. else if (hour < 17) return '下午好'
  155. else if (hour < 19) return '傍晚好'
  156. else if (hour < 22) return '晚上好'
  157. else return '夜里好'
  158. }
  159. /**
  160. * 将毫秒,转换成时间字符串。例如说,xx 分钟
  161. *
  162. * @param ms 毫秒
  163. * @returns {string} 字符串
  164. */
  165. export function formatPast2(ms: number): string {
  166. const day = Math.floor(ms / (24 * 60 * 60 * 1000))
  167. const hour = Math.floor(ms / (60 * 60 * 1000) - day * 24)
  168. const minute = Math.floor(ms / (60 * 1000) - day * 24 * 60 - hour * 60)
  169. const second = Math.floor(ms / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60)
  170. if (day > 0) {
  171. return day + ' 天' + hour + ' 小时 ' + minute + ' 分钟'
  172. }
  173. if (hour > 0) {
  174. return hour + ' 小时 ' + minute + ' 分钟'
  175. }
  176. if (minute > 0) {
  177. return minute + ' 分钟'
  178. }
  179. if (second > 0) {
  180. return second + ' 秒'
  181. } else {
  182. return 0 + ' 秒'
  183. }
  184. }
  185. /**
  186. * element plus 的时间 Formatter 实现,使用 YYYY-MM-DD HH:mm:ss 格式
  187. *
  188. * @param row 行数据
  189. * @param column 字段
  190. * @param cellValue 字段值
  191. */
  192. export function dateFormatter(_row: any, _column: TableColumnCtx<any>, cellValue: any): string {
  193. return cellValue ? formatDate(cellValue) : ''
  194. }
  195. /**
  196. * element plus 的时间 Formatter 实现,使用 YYYY-MM-DD 格式
  197. *
  198. * @param row 行数据
  199. * @param column 字段
  200. * @param cellValue 字段值
  201. */
  202. export function dateFormatter2(_row: any, _column: TableColumnCtx<any>, cellValue: any): string {
  203. return cellValue ? formatDate(cellValue, 'YYYY-MM-DD') : ''
  204. }
  205. /**
  206. * 设置起始日期,时间为00:00:00
  207. * @param param 传入日期
  208. * @returns 带时间00:00:00的日期
  209. */
  210. export function beginOfDay(param: Date): Date {
  211. return new Date(param.getFullYear(), param.getMonth(), param.getDate(), 0, 0, 0)
  212. }
  213. /**
  214. * 设置结束日期,时间为23:59:59
  215. * @param param 传入日期
  216. * @returns 带时间23:59:59的日期
  217. */
  218. export function endOfDay(param: Date): Date {
  219. return new Date(param.getFullYear(), param.getMonth(), param.getDate(), 23, 59, 59)
  220. }
  221. /**
  222. * 计算两个日期间隔天数
  223. * @param param1 日期1
  224. * @param param2 日期2
  225. */
  226. export function betweenDay(param1: Date, param2: Date): number {
  227. param1 = convertDate(param1)
  228. param2 = convertDate(param2)
  229. // 计算差值
  230. return Math.floor((param2.getTime() - param1.getTime()) / (24 * 3600 * 1000))
  231. }
  232. /**
  233. * 日期计算
  234. * @param param1 日期
  235. * @param param2 添加的时间
  236. */
  237. export function addTime(param1: Date, param2: number): Date {
  238. param1 = convertDate(param1)
  239. return new Date(param1.getTime() + param2)
  240. }
  241. /**
  242. * 日期转换
  243. * @param param 日期
  244. */
  245. export function convertDate(param: Date | string): Date {
  246. if (typeof param === 'string') {
  247. return new Date(param)
  248. }
  249. return param
  250. }
  251. /**
  252. * 指定的两个日期, 是否为同一天
  253. * @param a 日期 A
  254. * @param b 日期 B
  255. */
  256. export function isSameDay(a: dayjs.ConfigType, b: dayjs.ConfigType): boolean {
  257. if (!a || !b) return false
  258. const aa = dayjs(a)
  259. const bb = dayjs(b)
  260. return aa.year() == bb.year() && aa.month() == bb.month() && aa.day() == bb.day()
  261. }
  262. /**
  263. * 获取一天的开始时间、截止时间
  264. * @param date 日期
  265. * @param days 天数
  266. */
  267. export function getDayRange(
  268. date: dayjs.ConfigType,
  269. days: number
  270. ): [dayjs.ConfigType, dayjs.ConfigType] {
  271. const day = dayjs(date).add(days, 'd')
  272. return getDateRange(day, day)
  273. }
  274. /**
  275. * 获取最近7天的开始时间、截止时间
  276. */
  277. export function getLast7Days(): [dayjs.ConfigType, dayjs.ConfigType] {
  278. const lastWeekDay = dayjs().subtract(7, 'd')
  279. const yesterday = dayjs().subtract(1, 'd')
  280. return getDateRange(lastWeekDay, yesterday)
  281. }
  282. /**
  283. * 获取最近30天的开始时间、截止时间
  284. */
  285. export function getLast30Days(): [dayjs.ConfigType, dayjs.ConfigType] {
  286. const lastMonthDay = dayjs().subtract(30, 'd')
  287. const yesterday = dayjs().subtract(1, 'd')
  288. return getDateRange(lastMonthDay, yesterday)
  289. }
  290. /**
  291. * 获取最近1年的开始时间、截止时间
  292. */
  293. export function getLast1Year(): [dayjs.ConfigType, dayjs.ConfigType] {
  294. const lastYearDay = dayjs().subtract(1, 'y')
  295. const yesterday = dayjs().subtract(1, 'd')
  296. return getDateRange(lastYearDay, yesterday)
  297. }
  298. /**
  299. * 获取指定日期的开始时间、截止时间
  300. * @param beginDate 开始日期
  301. * @param endDate 截止日期
  302. */
  303. export function getDateRange(
  304. beginDate: dayjs.ConfigType,
  305. endDate: dayjs.ConfigType
  306. ): [string, string] {
  307. return [
  308. dayjs(beginDate).startOf('d').format('YYYY-MM-DD HH:mm:ss'),
  309. dayjs(endDate).endOf('d').format('YYYY-MM-DD HH:mm:ss')
  310. ]
  311. }