time-pretty.js 4.4 KB

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