date.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /**
  2. * 日期时间处理的工具库
  3. *
  4. * @author lautin
  5. * @created 2019-11-19 11:36:02
  6. */
  7. function getTimeZoneOffset(time) {
  8. const date = new Date(time);
  9. // 获取时区偏移值,返回分钟数
  10. let offset = date.getTimezoneOffset();
  11. return time + offset * 60 * 1000;
  12. }
  13. /**
  14. * 将时间戳转化成时间对象的方法
  15. * @param {mixed} time 传入一个时间戳或者时间对象
  16. */
  17. function time2Date(time, isOffset = false) {
  18. let date;
  19. if (time.constructor == Date) { // 传入一个时间对象
  20. date = time;
  21. } else { // 传入一个时间戳
  22. // 检测时间戳的长度,确保为ms
  23. if (time.toString().length <= 10) {
  24. time = Number(time) * 1000;
  25. }
  26. // 是否对时差进行转化
  27. if (isOffset) {
  28. time = getTimeZoneOffset(time);
  29. }
  30. // 转化成日期时间对象
  31. date = new Date(time);
  32. }
  33. return date;
  34. }
  35. /**
  36. * 将指定日期格式化输出,
  37. * @param string|object time 输入日期,为一个Date.now()或者Date.UTC返回的时间戳
  38. * @param string format 输出的格式
  39. * @param boolean isOffset 是否考虑时区
  40. */
  41. function parseTime(time, isOffset = false, cformat = null) {
  42. // 设置默认格式
  43. let format = cformat || '{y}-{m}-{d} {h}:{i}:{s}';
  44. const date = time2Date(time, isOffset);
  45. // 将日期时间值存入对象中
  46. const dataObj = {
  47. y: date.getFullYear(),
  48. m: date.getMonth() + 1, // 显示月份值需要+1
  49. d: date.getDate(),
  50. h: date.getHours(),
  51. i: date.getMinutes(),
  52. s: date.getSeconds(),
  53. a: date.getDay()
  54. };
  55. // 星期值需要转化为中文
  56. dataObj.a = '星期' + ['日', '一', '二', '三', '四', '五', '六'][dataObj.a];
  57. // 匹配{}中的y|m|d...部分,分别替换不同的值
  58. const result = format.replace(/{(y|m|d|h|i|s|a)+}/g, (segment, key) => {
  59. // 由索引提取值
  60. let value = dataObj[key];
  61. // 给值添加前导0
  62. if (segment.length > 0 && value < 10) value = '0' + value;
  63. return value || 0;
  64. });
  65. return result;
  66. }
  67. /**
  68. * 发布日期的特定显示方式,
  69. * @param {string|number} time 显示日期的时间戳
  70. * @param {string} option 可选参数显示日期
  71. */
  72. function pubTime(time, isOffset = false, format = null) {
  73. const date = time2Date(time, isOffset);
  74. const current = isOffset ? getTimeZoneOffset(Date.now()) : Date.now();
  75. // 计算时间的差值,返回s为单位的值
  76. let diff = (current - date.valueOf()) / 1000;
  77. // 2天以内显示距今时间
  78. if (diff < 30) { // 30s-
  79. return '刚刚';
  80. } else if (diff < 3600) { // 1h-
  81. return Math.ceil(diff / 60) + '分钟前';
  82. } else if (diff < 3600 * 24) { // 1d-
  83. return Math.ceil(diff / 3600) + '小时前';
  84. } else if (diff < 3600 * 24 * 2) { // 2d-
  85. return '1天前';
  86. } else { // 超过2天显示发布日期
  87. if (!format) format = '{y}年{m}月{d}日 {h}:{i}';
  88. return parseTime(time, isOffset, format);
  89. }
  90. }
  91. // 将方法写入构造函数 便于全局使用
  92. Object.assign(Date, {
  93. time2Date,
  94. parseTime,
  95. pubTime,
  96. });
  97. export default{
  98. time2Date,
  99. parseTime,
  100. pubTime
  101. }