date.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // 时间戳转换为年月日时分秒 timestampToDate
  2. export const timesTampChange = (timestamp, format = 'Y-M-D h:m:s') => {
  3. if (!timestamp) return ''
  4. const date = new Date(timestamp)
  5. const Y = date.getFullYear().toString()
  6. const M = (date.getMonth() + 1).toString().padStart(2, '0')
  7. const D = date.getDate().toString().padStart(2, '0')
  8. const h = date.getHours().toString().padStart(2, '0')
  9. const m = date.getMinutes().toString().padStart(2, '0')
  10. const s = date.getSeconds().toString().padStart(2, '0')
  11. const formatter = { 'Y': Y, 'M': M, 'D': D, 'h': h, 'm': m, 's': s } // 替换format中的占位符
  12. let formattedDate = format.replace(/Y|M|D|h|m|s/g, matched => formatter[matched]) // 使用正则表达式匹配并替换占位符
  13. if (!formattedDate) formattedDate = Y + '-' + M + '-' + D + ' ' + h + ':' + m + ':' + s
  14. return formattedDate
  15. }
  16. // 将 Wed May 01 2024 00:00:00 GMT+0800 (中国标准时间) 转换为时间戳
  17. export const getTimeStamp = (str) => {
  18. if (!str) return ''
  19. const date = new Date(str)
  20. return date.getTime()
  21. }
  22. // 时间戳转换为年龄
  23. export const timestampToAge = (timestamp) => {
  24. if (!timestamp) return null
  25. const birthDate = new Date(timestamp);
  26. const today = new Date();
  27. let age = today.getFullYear() - birthDate.getFullYear();
  28. const monthDiff = today.getMonth() - birthDate.getMonth();
  29. // 如果当前月份小于出生月份,或者月份相同但日期未到生日
  30. if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) age--;
  31. return age;
  32. }
  33. // 传入一个时间戳返回这个日期的最早时间点以及最晚时间点 输出:[1721232000000, 1721318399999]
  34. export const getDayBounds = (timestamp) => {
  35. const date = new Date(timestamp)
  36. date.setHours(0, 0, 0, 0)
  37. const startOfDay = date.getTime()
  38. const endOfDay = new Date(timestamp)
  39. endOfDay.setHours(23, 59, 59, 999)
  40. if (endOfDay.getDate() !== date.getDate()) {
  41. endOfDay.setDate(endOfDay.getDate() - 1)
  42. endOfDay.setHours(23, 59, 59, 999)
  43. }
  44. // 返回包含最早和最晚时间点的时间戳的数组
  45. return [startOfDay, endOfDay.getTime()]
  46. }
  47. // 传入 Wed May 01 2024 00:00:00 GMT+0800 (中国标准时间) 输出 [2024-07-18 00:00:00, 2024-07-18 23:59:59]
  48. export const getStartAndEndOfDay = (dateTimeStr) => {
  49. const date = new Date(dateTimeStr)
  50. const year = date.getFullYear()
  51. const month = String(date.getMonth() + 1).padStart(2, '0')
  52. const day = String(date.getDate()).padStart(2, '0')
  53. const startTime = `${year}-${month}-${day} 00:00:00`
  54. const endTime = `${year}-${month}-${day} 23:59:59`
  55. return [startTime, endTime]
  56. }
  57. // 传入一组时间戳,返回 [最早时间点,最晚时间点]
  58. export const convertTimestampsToDayRange = (timestamps) => {
  59. if (timestamps.length < 2) {
  60. throw new Error('Timestamps array must contain at least two elements')
  61. }
  62. function formatDate(date) {
  63. const year = date.getFullYear();
  64. const month = String(date.getMonth() + 1).padStart(2, '0')
  65. const day = String(date.getDate()).padStart(2, '0')
  66. const hours = String(date.getHours()).padStart(2, '0')
  67. const minutes = String(date.getMinutes()).padStart(2, '0')
  68. const seconds = String(date.getSeconds()).padStart(2, '0')
  69. return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
  70. }
  71. const startDate = new Date(timestamps[0])
  72. const endDate = new Date(timestamps[1])
  73. const startOfDay = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate())
  74. const endOfDay = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate() + 1, 0, 0, 0, -1)
  75. return [formatDate(startOfDay), formatDate(endOfDay)]
  76. }
  77. // 返回时间差,最小计量单位为一个月。示例用法:
  78. // const startTime = 1633072800000; // 2021-10-01 00:00:00 UTC(秒级时间戳)
  79. // const endTime = 1667244000000; // 2022-11-01 00:00:00 UTC(秒级时间戳)
  80. export const getTimeDifferenceInChinese = (startTime, endTime) => {
  81. // 将时间戳转换为 Date 对象(假设时间戳单位为毫秒)
  82. const startDate = startTime ? new Date(startTime) : new Date();
  83. const endDate = endTime ? new Date(endTime) : new Date();
  84. // 计算年份差
  85. let yearsDiff = endDate.getFullYear() - startDate.getFullYear();
  86. // 计算月份差(考虑年份差后调整)
  87. let monthsDiff = endDate.getMonth() - startDate.getMonth();
  88. // 如果月份差为负,则从上一年借月
  89. if (monthsDiff < 0) {
  90. yearsDiff--;
  91. monthsDiff += 12;
  92. }
  93. // 计算日期差(考虑月份差后调整,如果日期差为负,则从上一月借天)
  94. let daysDiff = endDate.getDate() - startDate.getDate();
  95. if (daysDiff < 0) {
  96. monthsDiff--;
  97. // 获取 startDate 所在月的最后一天
  98. const lastDayOfMonth = new Date(startDate.getFullYear(), startDate.getMonth() + 1, 0).getDate();
  99. daysDiff += lastDayOfMonth; // 加上最后一天以补全月份差
  100. }
  101. // 构建结果字符串
  102. let result = "";
  103. if (yearsDiff > 0) {
  104. result += `${yearsDiff}年`;
  105. }
  106. if (monthsDiff > 0) {
  107. if (result) {
  108. // 如果已经有年份差异,则直接添加月份数(不带单位),后面正则替换会处理
  109. result += monthsDiff;
  110. } else {
  111. // 如果没有年份差异,则正常添加月份和单位
  112. result += `${monthsDiff}个月`;
  113. // 特别处理只有1个月的情况
  114. if (monthsDiff === 1) {
  115. result = "不到1个月"; // 直接替换为“不到1个月”,避免后续复杂的正则替换
  116. }
  117. }
  118. } else if (!result && daysDiff >= 0) {
  119. // 如果没有年份和月份差异,但天数差异存在(这里其实没处理天数,只是为完整性添加)
  120. // 理论上应该处理天数,但题目要求只到月份,所以这里直接返回“不到1个月”
  121. result = "不到1个月";
  122. }
  123. // 如果之前添加了月份数但没有年份(且不是直接处理的1个月情况),则需要去除末尾多余的数字并添加“个月”
  124. if (result && !/\d年$/.test(result) && /\d$/.test(result)) {
  125. result += "个月";
  126. }
  127. return result
  128. }