time-pretty.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var time_1 = require("../util/time");
  4. function getYear(date) {
  5. return new Date(date).getFullYear();
  6. }
  7. function createYear(year) {
  8. return new Date(year, 0, 1).getTime();
  9. }
  10. function getMonth(date) {
  11. return new Date(date).getMonth();
  12. }
  13. function diffMonth(min, max) {
  14. var minYear = getYear(min);
  15. var maxYear = getYear(max);
  16. var minMonth = getMonth(min);
  17. var maxMonth = getMonth(max);
  18. return (maxYear - minYear) * 12 + ((maxMonth - minMonth) % 12);
  19. }
  20. function creatMonth(year, month) {
  21. return new Date(year, month, 1).getTime();
  22. }
  23. function diffDay(min, max) {
  24. return Math.ceil((max - min) / time_1.DAY);
  25. }
  26. function diffHour(min, max) {
  27. return Math.ceil((max - min) / time_1.HOUR);
  28. }
  29. function diffMinus(min, max) {
  30. return Math.ceil((max - min) / (60 * 1000));
  31. }
  32. /**
  33. * 计算 time 的 ticks,对 month, year 进行 pretty 处理
  34. * @param cfg 度量的配置项
  35. * @returns 计算后的 ticks
  36. */
  37. function timePretty(cfg) {
  38. var min = cfg.min, max = cfg.max, minTickInterval = cfg.minTickInterval, tickCount = cfg.tickCount;
  39. var tickInterval = cfg.tickInterval;
  40. var ticks = [];
  41. // 指定 tickInterval 后 tickCount 不生效,需要重新计算
  42. if (!tickInterval) {
  43. tickInterval = (max - min) / tickCount;
  44. // 如果设置了最小间距,则使用最小间距
  45. if (minTickInterval && tickInterval < minTickInterval) {
  46. tickInterval = minTickInterval;
  47. }
  48. }
  49. tickInterval = Math.max(Math.floor((max - min) / (Math.pow(2, 12) - 1)), tickInterval);
  50. var minYear = getYear(min);
  51. // 如果间距大于 1 年,则将开始日期从整年开始
  52. if (tickInterval > time_1.YEAR) {
  53. var maxYear = getYear(max);
  54. var yearInterval = Math.ceil(tickInterval / time_1.YEAR);
  55. for (var i = minYear; i <= maxYear + yearInterval; i = i + yearInterval) {
  56. ticks.push(createYear(i));
  57. }
  58. }
  59. else if (tickInterval > time_1.MONTH) {
  60. // 大于月时
  61. var monthInterval = Math.ceil(tickInterval / time_1.MONTH);
  62. var mmMoth = getMonth(min);
  63. var dMonths = diffMonth(min, max);
  64. for (var i = 0; i <= dMonths + monthInterval; i = i + monthInterval) {
  65. ticks.push(creatMonth(minYear, i + mmMoth));
  66. }
  67. }
  68. else if (tickInterval > time_1.DAY) {
  69. // 大于天
  70. var date = new Date(min);
  71. var year = date.getFullYear();
  72. var month = date.getMonth();
  73. var mday = date.getDate();
  74. var day = Math.ceil(tickInterval / time_1.DAY);
  75. var ddays = diffDay(min, max);
  76. for (var i = 0; i < ddays + day; i = i + day) {
  77. ticks.push(new Date(year, month, mday + i).getTime());
  78. }
  79. }
  80. else if (tickInterval > time_1.HOUR) {
  81. // 大于小时
  82. var date = new Date(min);
  83. var year = date.getFullYear();
  84. var month = date.getMonth();
  85. var day = date.getDate();
  86. var hour = date.getHours();
  87. var hours = Math.ceil(tickInterval / time_1.HOUR);
  88. var dHours = diffHour(min, max);
  89. for (var i = 0; i <= dHours + hours; i = i + hours) {
  90. ticks.push(new Date(year, month, day, hour + i).getTime());
  91. }
  92. }
  93. else if (tickInterval > time_1.MINUTE) {
  94. // 大于分钟
  95. var dMinus = diffMinus(min, max);
  96. var minutes = Math.ceil(tickInterval / time_1.MINUTE);
  97. for (var i = 0; i <= dMinus + minutes; i = i + minutes) {
  98. ticks.push(min + i * time_1.MINUTE);
  99. }
  100. }
  101. else {
  102. // 小于分钟
  103. var interval = tickInterval;
  104. if (interval < time_1.SECOND) {
  105. interval = time_1.SECOND;
  106. }
  107. var minSecond = Math.floor(min / time_1.SECOND) * time_1.SECOND;
  108. var dSeconds = Math.ceil((max - min) / time_1.SECOND);
  109. var seconds = Math.ceil(interval / time_1.SECOND);
  110. for (var i = 0; i < dSeconds + seconds; i = i + seconds) {
  111. ticks.push(minSecond + i * time_1.SECOND);
  112. }
  113. }
  114. // 最好是能从算法能解决这个问题,但是如果指定了 tickInterval,计算 ticks,也只能这么算,所以
  115. // 打印警告提示
  116. if (ticks.length >= 512) {
  117. console.warn("Notice: current ticks length(" + ticks.length + ") >= 512, may cause performance issues, even out of memory. Because of the configure \"tickInterval\"(in milliseconds, current is " + tickInterval + ") is too small, increase the value to solve the problem!");
  118. }
  119. return ticks;
  120. }
  121. exports.default = timePretty;
  122. //# sourceMappingURL=time-pretty.js.map