time-pretty.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. var minYear = getYear(min);
  48. // 如果间距大于 1 年,则将开始日期从整年开始
  49. if (tickInterval > YEAR) {
  50. var maxYear = getYear(max);
  51. var yearInterval = Math.ceil(tickInterval / YEAR);
  52. for (var i = minYear; i <= maxYear + yearInterval; i = i + yearInterval) {
  53. ticks.push(createYear(i));
  54. }
  55. }
  56. else if (tickInterval > MONTH) {
  57. // 大于月时
  58. var monthInterval = Math.ceil(tickInterval / MONTH);
  59. var mmMoth = getMonth(min);
  60. var dMonths = diffMonth(min, max);
  61. for (var i = 0; i <= dMonths + monthInterval; i = i + monthInterval) {
  62. ticks.push(creatMonth(minYear, i + mmMoth));
  63. }
  64. }
  65. else if (tickInterval > DAY) {
  66. // 大于天
  67. var date = new Date(min);
  68. var year = date.getFullYear();
  69. var month = date.getMonth();
  70. var mday = date.getDate();
  71. var day = Math.ceil(tickInterval / DAY);
  72. var ddays = diffDay(min, max);
  73. for (var i = 0; i < ddays + day; i = i + day) {
  74. ticks.push(new Date(year, month, mday + i).getTime());
  75. }
  76. }
  77. else if (tickInterval > HOUR) {
  78. // 大于小时
  79. var date = new Date(min);
  80. var year = date.getFullYear();
  81. var month = date.getMonth();
  82. var day = date.getDate();
  83. var hour = date.getHours();
  84. var hours = Math.ceil(tickInterval / HOUR);
  85. var dHours = diffHour(min, max);
  86. for (var i = 0; i <= dHours + hours; i = i + hours) {
  87. ticks.push(new Date(year, month, day, hour + i).getTime());
  88. }
  89. }
  90. else if (tickInterval > MINUTE) {
  91. // 大于分钟
  92. var dMinus = diffMinus(min, max);
  93. var minutes = Math.ceil(tickInterval / MINUTE);
  94. for (var i = 0; i <= dMinus + minutes; i = i + minutes) {
  95. ticks.push(min + i * MINUTE);
  96. }
  97. }
  98. else {
  99. // 小于分钟
  100. var interval = tickInterval;
  101. if (interval < SECOND) {
  102. interval = SECOND;
  103. }
  104. var minSecond = Math.floor(min / SECOND) * SECOND;
  105. var dSeconds = Math.ceil((max - min) / SECOND);
  106. var seconds = Math.ceil(interval / SECOND);
  107. for (var i = 0; i < dSeconds + seconds; i = i + seconds) {
  108. ticks.push(minSecond + i * SECOND);
  109. }
  110. }
  111. // 最好是能从算法能解决这个问题,但是如果指定了 tickInterval,计算 ticks,也只能这么算,所以
  112. // 打印警告提示
  113. if (ticks.length >= 512) {
  114. 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!");
  115. }
  116. return ticks;
  117. }
  118. //# sourceMappingURL=time-pretty.js.map