timeUtil.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /**
  2. * 时间工具类
  3. */
  4. let timeUtil = {};
  5. // 尽可能的将参数转成正确的时间对象
  6. timeUtil.getDateObject = function(date) {
  7. if (!date) return "";
  8. let nowDate;
  9. // 如果是字符串,且纯数字,则强制转数值
  10. if (typeof date === "string" && !isNaN(date)) date = Number(date);
  11. if (typeof date === "number") {
  12. if (date.toString().length === 10) date *= 1000;
  13. nowDate = new Date(date); // 转时间对象
  14. } else if (typeof date === "object") {
  15. nowDate = new Date(date.getTime()); // 新建一个时间对象
  16. }
  17. return nowDate;
  18. };
  19. /**
  20. * 日期格式化
  21. * @param {Date || Number} date 需要格式化的时间
  22. * timeUtil.timeFormat(new Date(),"yyyy-MM-dd hh:mm:ss");
  23. */
  24. timeUtil.timeFormat = function(date, fmt = 'yyyy-MM-dd hh:mm:ss') {
  25. try {
  26. if (!date) return "";
  27. let nowDate = timeUtil.getDateObject(date);
  28. let opt = {
  29. "M+": nowDate.getMonth() + 1, //月份
  30. "d+": nowDate.getDate(), //日
  31. "h+": nowDate.getHours(), //小时
  32. "m+": nowDate.getMinutes(), //分
  33. "s+": nowDate.getSeconds(), //秒
  34. //"w+": nowDate.getDay(), //周
  35. "q+": Math.floor((nowDate.getMonth() + 3) / 3), //季度
  36. "S": nowDate.getMilliseconds() //毫秒
  37. };
  38. if (/(y+)/.test(fmt)) {
  39. fmt = fmt.replace(RegExp.$1, (nowDate.getFullYear() + "").substr(4 - RegExp.$1.length));
  40. }
  41. for (let k in opt) {
  42. if (new RegExp("(" + k + ")").test(fmt)) {
  43. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (opt[k]) : (("00" + opt[k]).substr(("" + opt[k]).length)));
  44. }
  45. }
  46. return fmt;
  47. } catch (err) {
  48. // 若格式错误,则原值显示
  49. return time;
  50. }
  51. };
  52. /**
  53. * 解析日期对象属性
  54. * @param {Date || Number} date 需要转换的时间
  55. * timeUtil.getDateInfo(new Date());
  56. */
  57. timeUtil.getDateInfo = function(date = new Date()) {
  58. let nowDate = timeUtil.getDateObject(date);
  59. let year = nowDate.getFullYear() + '';
  60. let month = (nowDate.getMonth() + 1 < 10 ? '0' + (nowDate.getMonth() + 1) : nowDate.getMonth() + 1);
  61. let day = (nowDate.getDate() < 10 ? '0' + (nowDate.getDate()) : nowDate.getDate());
  62. let hour = (nowDate.getHours() < 10 ? '0' + (nowDate.getHours()) : nowDate.getHours());
  63. let minute = (nowDate.getMinutes() < 10 ? '0' + (nowDate.getMinutes()) : nowDate.getMinutes());
  64. let second = (nowDate.getSeconds() < 10 ? '0' + (nowDate.getSeconds()) : nowDate.getSeconds());
  65. let millisecond = nowDate.getMilliseconds(); //毫秒
  66. let week = nowDate.getDay(); // 周
  67. let quarter = Math.floor((nowDate.getMonth() + 3) / 3); //季度
  68. return {
  69. year: Number(year),
  70. month: Number(month),
  71. day: Number(day),
  72. hour: Number(hour),
  73. minute: Number(minute),
  74. second: Number(second),
  75. millisecond: Number(millisecond),
  76. week: Number(week),
  77. quarter: Number(quarter),
  78. };
  79. };
  80. /**
  81. * 获得相对当前时间的偏移 count 小时、天、周、月、季度、年的起止日期(开始和结束时间戳)
  82. * @param {Number} count 偏移量
  83. * @param {Date || Number} date 指定从哪个时间节点开始计算
  84. * timeUtil.getOffsetStartAndEnd("hour", 0);
  85. * timeUtil.getOffsetStartAndEnd("day", 0);
  86. * timeUtil.getOffsetStartAndEnd("week", 0);
  87. * timeUtil.getOffsetStartAndEnd("month", 0);
  88. * timeUtil.getOffsetStartAndEnd("quarter", 0);
  89. * timeUtil.getOffsetStartAndEnd("year", 0);
  90. */
  91. timeUtil.getOffsetStartAndEnd = function(type="day", count = 0, date = new Date()) {
  92. let startTime, endTime;
  93. let nowDate = timeUtil.getDateObject(date);
  94. if (type === "hour") {
  95. // 小时
  96. // 一小时毫秒数
  97. let offsetMillisecond = 1000 * 60 * 60;
  98. // 相对于当前日期count个天的日期
  99. let dateInfo = timeUtil.getDateInfo(new Date(nowDate.getTime() + (offsetMillisecond * 1 * count)));
  100. // 获得当天的起始时间
  101. startTime = new Date(`${dateInfo.year}/${dateInfo.month}/${dateInfo.day} ${dateInfo.hour}:00:00`).getTime();
  102. // 获得当天的结束时间
  103. endTime = new Date(`${dateInfo.year}/${dateInfo.month}/${dateInfo.day} ${dateInfo.hour}:00:00`).getTime() + (offsetMillisecond -1);
  104. } else if (type === "day") {
  105. // 天
  106. // 一天的毫秒数
  107. let offsetMillisecond = 1000 * 60 * 60 * 24;
  108. // 相对于当前日期count个天的日期
  109. let dateInfo = timeUtil.getDateInfo(new Date(nowDate.getTime() + (offsetMillisecond * 1 * count)));
  110. // 获得当天的起始时间
  111. startTime = new Date(`${dateInfo.year}/${dateInfo.month}/${dateInfo.day}`).getTime();
  112. // 获得当天的结束时间
  113. endTime = new Date(`${dateInfo.year}/${dateInfo.month}/${dateInfo.day}`).getTime() + (offsetMillisecond - 1);
  114. } else if (type === "week") {
  115. // 周
  116. nowDate.setDate(nowDate.getDate() - nowDate.getDay() + 1 + count * 7);
  117. let dateInfo1 = timeUtil.getDateInfo(nowDate);
  118. nowDate.setDate(nowDate.getDate() + 7);
  119. let dateInfo2 = timeUtil.getDateInfo(nowDate);
  120. // 开始时间
  121. startTime = new Date(`${dateInfo1.year}/${dateInfo1.month}/${dateInfo1.day}`).getTime();
  122. // 结束时间
  123. endTime = new Date(`${dateInfo2.year}/${dateInfo2.month}/${dateInfo2.day}`).getTime() - 1;
  124. } else if (type === "month") {
  125. // 月
  126. let dateInfo = timeUtil.getDateInfo(nowDate);
  127. let month = dateInfo.month + count;
  128. let year = dateInfo.year;
  129. if (month > 12) {
  130. year = year + Math.floor(month / 12);
  131. month = Math.abs(month) % 12;
  132. } else if (month <= 0) {
  133. year = year - 1 - Math.floor(Math.abs(month) / 12);
  134. month = 12 - Math.abs(month) % 12;
  135. }
  136. let month_last_day = new Date(year, month, 0).getDate();
  137. // 开始时间
  138. startTime = new Date(`${year}/${month}/1`).getTime();
  139. // 结束时间
  140. endTime = new Date(`${year}/${month}/${month_last_day}`).getTime() + (24 * 60 * 60 * 1000 - 1);
  141. } else if (type === "quarter") {
  142. // 季度
  143. nowDate.setMonth(nowDate.getMonth() + count * 3);
  144. let dateInfo = timeUtil.getDateInfo(nowDate);
  145. let month = dateInfo.month;
  146. if ([1, 2, 3].indexOf(month) > -1) {
  147. // 第1季度
  148. month = 1;
  149. } else if ([4, 5, 6].indexOf(month) > -1) {
  150. // 第2季度
  151. month = 4;
  152. } else if ([7, 8, 9].indexOf(month) > -1) {
  153. // 第3季度
  154. month = 7;
  155. } else if ([10, 11, 12].indexOf(month) > -1) {
  156. // 第4季度
  157. month = 10;
  158. }
  159. nowDate.setMonth(month - 1); // 因为0代表1月,所以这里要减1
  160. let dateInfo1 = timeUtil.getDateInfo(nowDate);
  161. nowDate.setMonth(nowDate.getMonth() + 3);
  162. let dateInfo2 = timeUtil.getDateInfo(nowDate);
  163. // 开始时间
  164. startTime = new Date(`${dateInfo1.year}/${dateInfo1.month}/1`).getTime();
  165. // 结束时间
  166. endTime = new Date(`${dateInfo2.year}/${dateInfo2.month}/1`).getTime() - 1;
  167. } else if (type === "year") {
  168. // 年
  169. let dateInfo = timeUtil.getDateInfo(nowDate);
  170. let year = dateInfo.year + count;
  171. // 开始时间
  172. startTime = new Date(`${year}/1/1`).getTime();
  173. // 结束时间
  174. endTime = new Date(`${year}/12/31`).getTime() + (24 * 60 * 60 * 1000 - 1);
  175. }
  176. return {
  177. startTime,
  178. endTime
  179. };
  180. };
  181. export default timeUtil;