chatDate.js 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. export const MILLISECONDS_A_SECOND = 1e3
  2. export const MILLISECONDS_A_MINUTE = 60 * MILLISECONDS_A_SECOND
  3. export const MILLISECONDS_A_HOUR = 60 * MILLISECONDS_A_MINUTE
  4. export const MILLISECONDS_A_DAY = 24 * MILLISECONDS_A_HOUR
  5. export const diff = (dt1, dt2) => {
  6. if (!dt1 || !dt2) return [];
  7. const bw = new Date(dt1) - new Date(dt2)
  8. const day = Math.floor(bw / MILLISECONDS_A_DAY)
  9. const hour = Math.floor(bw % MILLISECONDS_A_DAY / MILLISECONDS_A_HOUR)
  10. const min = Math.floor(bw % MILLISECONDS_A_DAY % MILLISECONDS_A_HOUR / MILLISECONDS_A_MINUTE)
  11. const sec = Math.floor(bw % MILLISECONDS_A_DAY % MILLISECONDS_A_HOUR % MILLISECONDS_A_MINUTE / MILLISECONDS_A_SECOND)
  12. return [bw, day, hour, min, sec]
  13. }
  14. //例子 getDateFormat(new Date().valueOf(),true,'yyyy/M/d')
  15. export function formatDate(dt, fmt) {
  16. const date = new Date(dt)
  17. var o = {
  18. "M+": date.getMonth() + 1, //月份
  19. "d+": date.getDate(), //日
  20. "h+": date.getHours(), //小时
  21. "m+": date.getMinutes(), //分
  22. "s+": date.getSeconds(), //秒
  23. "q+": Math.floor((date.getMonth() + 3) / 3), //季度
  24. "S": date.getMilliseconds() //毫秒
  25. };
  26. if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
  27. for (var k in o)
  28. if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  29. return fmt;
  30. };
  31. /**
  32. * 仿照微信中的消息时间显示逻辑,将时间戳(单位:毫秒)转换为友好的显示格式.
  33. *
  34. * 1)7天之内的日期显示逻辑是:今天、昨天(-1d)、前天(-2d)、星期?(只显示总计7天之内的星期数,即<=-4d);
  35. * 2)7天之外(即>7天)的逻辑:直接显示完整日期时间。
  36. *
  37. * @param {[string|date]} dt 时间
  38. * @param {boolean} mustIncludeTime true表示输出的格式里一定会包含“时间:分钟”
  39. * ,否则不包含(参考微信,不包含时分的情况,用于首页“消息”中显示时)
  40. *
  41. * @return {string} 输出格式形如:“刚刚”、“10:30”、“昨天 12:04”、“前天 20:51”、“星期二”、“2019/2/21 12:09”等形式
  42. * @since 1.1
  43. */
  44. export function getDateForHumans(dt, mustIncludeTime, format='yyyy-M-d') {
  45. // 当前时间
  46. var currentDate = new Date();
  47. // 目标判断时间
  48. var srcDate = new Date(dt);
  49. var currentYear = currentDate.getFullYear();
  50. var currentMonth = (currentDate.getMonth() + 1);
  51. var currentDateD = currentDate.getDate();
  52. var srcYear = srcDate.getFullYear();
  53. var srcMonth = (srcDate.getMonth() + 1);
  54. var srcDateD = srcDate.getDate();
  55. var ret = "";
  56. // 要额外显示的时间分钟
  57. var timeExtraStr = (mustIncludeTime ? " " + formatDate(srcDate, "hh:mm") : "");
  58. // 当年
  59. if (currentYear == srcYear) {
  60. // 相差时间(单位:毫秒)
  61. var deltaTime = (currentDate - srcDate);
  62. // 当天(月份和日期一致才是)
  63. if (currentMonth == srcMonth && currentDateD == srcDateD) {
  64. // 时间相差60秒以内
  65. if (deltaTime < 60 * 1000)
  66. ret = "刚刚";
  67. // 否则当天其它时间段的,直接显示“时:分”的形式
  68. else
  69. ret = formatDate(srcDate, "hh:mm");
  70. }
  71. // 当年 && 当天之外的时间(即昨天及以前的时间)
  72. else {
  73. // 昨天(以“现在”的时候为基准-1天)
  74. var yesterdayDate = new Date();
  75. yesterdayDate.setDate(yesterdayDate.getDate() - 1);
  76. // 前天(以“现在”的时候为基准-2天)
  77. var beforeYesterdayDate = new Date();
  78. beforeYesterdayDate.setDate(beforeYesterdayDate.getDate() - 2);
  79. // 用目标日期的“月”和“天”跟上方计算出来的“昨天”进行比较,是最为准确的(如果用时间戳差值
  80. // 的形式,是不准确的,比如:现在时刻是2019年02月22日1:00、而srcDate是2019年02月21日23:00,
  81. // 这两者间只相差2小时,直接用“deltaTime/(3600 * 1000)” > 24小时来判断是否昨天,就完全是扯蛋的逻辑了)
  82. if (srcMonth == (yesterdayDate.getMonth() + 1) && srcDateD == yesterdayDate.getDate())
  83. ret = "昨天" + timeExtraStr;// -1d
  84. // “前天”判断逻辑同上
  85. else if (srcMonth == (beforeYesterdayDate.getMonth() + 1) && srcDateD == beforeYesterdayDate.getDate())
  86. ret = "前天" + timeExtraStr;// -2d
  87. else {
  88. // 跟当前时间相差的小时数
  89. var deltaHour = (deltaTime / (3600 * 1000));
  90. // 如果小于或等 7*24小时就显示星期几
  91. if (deltaHour <= 7 * 24) {
  92. var weekday = new Array(7);
  93. weekday[0] = "星期日";
  94. weekday[1] = "星期一";
  95. weekday[2] = "星期二";
  96. weekday[3] = "星期三";
  97. weekday[4] = "星期四";
  98. weekday[5] = "星期五";
  99. weekday[6] = "星期六";
  100. // 取出当前是星期几
  101. var weedayDesc = weekday[srcDate.getDay()];
  102. ret = weedayDesc + timeExtraStr;
  103. }
  104. // 否则直接显示完整日期时间
  105. else
  106. ret = formatDate(srcDate, format) + timeExtraStr;
  107. }
  108. }
  109. }
  110. // 往年
  111. else {
  112. ret = formatDate(srcDate, format) + timeExtraStr;
  113. }
  114. return ret;
  115. };