time.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /**
  2. * @fileOverview 计算时间坐标轴
  3. * @author dxq613@gmail.com
  4. */
  5. var AutoUtil = require('./util');
  6. var isNil = require('@antv/util/lib/type/is-nil');
  7. var MAX_COUNT = 6;
  8. var SNAP_ARRAY = [1, 2, 4, 6, 8, 12];
  9. var MINUTE_MS = 60 * 1000;
  10. var HOUR_MS = 3600 * 1000;
  11. var DAY_MS = 24 * 3600 * 1000;
  12. function getYear(date) {
  13. return new Date(date).getFullYear();
  14. }
  15. function createYear(year) {
  16. return new Date(year, 0, 1).getTime();
  17. }
  18. function getMonth(date) {
  19. return new Date(date).getMonth();
  20. }
  21. function diffMonth(min, max) {
  22. var minYear = getYear(min);
  23. var maxYear = getYear(max);
  24. var minMonth = getMonth(min);
  25. var maxMonth = getMonth(max);
  26. return (maxYear - minYear) * 12 + (maxMonth - minMonth) % 12;
  27. }
  28. function creatMonth(year, month) {
  29. return new Date(year, month, 1).getTime();
  30. }
  31. function diffDay(min, max) {
  32. return Math.ceil((max - min) / DAY_MS);
  33. }
  34. function diffHour(min, max) {
  35. return Math.ceil((max - min) / HOUR_MS);
  36. }
  37. function diffMinus(min, max) {
  38. return Math.ceil((max - min) / (60 * 1000));
  39. }
  40. module.exports = function (info) {
  41. var minInterval = info.minInterval;
  42. var ticks = [];
  43. var min = info.min;
  44. var max = info.max;
  45. var interval = info.interval;
  46. var count; // 如果最大值和最小值相等,则设置最大值大于最小值一天
  47. if (max === min) {
  48. max = min + DAY_MS;
  49. } // 计算间距
  50. if (isNil(interval)) {
  51. var innerTime = max - min;
  52. var dms = DAY_MS; // 天代表的秒
  53. var yms = 365 * dms; // 年代表的秒
  54. interval = parseInt(innerTime / (info.maxCount || MAX_COUNT), 10);
  55. if (minInterval && minInterval > interval) {
  56. interval = minInterval;
  57. }
  58. var yfactor = interval / yms;
  59. var minYear = getYear(min); // 大于半年
  60. if (yfactor > 0.51) {
  61. var year = Math.ceil(yfactor); // interval = year * yms;
  62. var maxYear = getYear(max);
  63. for (var i = minYear; i <= maxYear + year; i = i + year) {
  64. ticks.push(createYear(i));
  65. }
  66. interval = null;
  67. } else if (yfactor > 0.0834) {
  68. // 大于一个月
  69. var month = Math.ceil(yfactor / 0.0834);
  70. var mmMoth = getMonth(min);
  71. var dMonths = diffMonth(min, max);
  72. for (var _i = 0; _i <= dMonths + month; _i = _i + month) {
  73. ticks.push(creatMonth(minYear, _i + mmMoth));
  74. }
  75. interval = null;
  76. } else if (interval > dms * 0.5) {
  77. // 大于一天
  78. var date = new Date(min);
  79. var _year = date.getFullYear();
  80. var _month = date.getMonth(min);
  81. var mday = date.getDate();
  82. var day = Math.ceil(interval / dms);
  83. var ddays = diffDay(min, max);
  84. interval = day * dms;
  85. for (var _i2 = 0; _i2 < ddays + day; _i2 = _i2 + day) {
  86. ticks.push(new Date(_year, _month, mday + _i2).getTime());
  87. }
  88. } else if (interval > HOUR_MS) {
  89. // 大于一个小时
  90. var _date = new Date(min);
  91. var _year2 = _date.getFullYear();
  92. var _month2 = _date.getMonth(min);
  93. var _day = _date.getDate();
  94. var hour = _date.getHours();
  95. var hours = AutoUtil.snapTo(SNAP_ARRAY, Math.ceil(interval / HOUR_MS));
  96. var dHours = diffHour(min, max);
  97. interval = hours * HOUR_MS;
  98. for (var _i3 = 0; _i3 <= dHours + hours; _i3 = _i3 + hours) {
  99. ticks.push(new Date(_year2, _month2, _day, hour + _i3).getTime());
  100. }
  101. } else if (interval > MINUTE_MS) {
  102. // 最小单位是分钟
  103. var dMinus = diffMinus(min, max);
  104. var minutes = Math.ceil(interval / MINUTE_MS);
  105. interval = minutes * MINUTE_MS;
  106. for (var _i4 = 0; _i4 <= dMinus + minutes; _i4 = _i4 + minutes) {
  107. ticks.push(min + _i4 * MINUTE_MS);
  108. }
  109. } else {
  110. if (interval < 1000) {
  111. interval = 1000;
  112. }
  113. min = Math.floor(min / 1000) * 1000;
  114. var dSeconds = Math.ceil((max - min) / 1000);
  115. var seconds = Math.ceil(interval / 1000);
  116. interval = seconds * 1000;
  117. for (var _i5 = 0; _i5 < dSeconds + seconds; _i5 = _i5 + seconds) {
  118. ticks.push(min + _i5 * 1000);
  119. }
  120. }
  121. }
  122. if (!ticks.length) {
  123. min = Math.floor(min / 1000) * 1000;
  124. max = Math.ceil(max / 1000) * 1000;
  125. count = (max - min) / interval;
  126. for (var _i6 = 0; _i6 <= count; _i6++) {
  127. ticks.push(AutoUtil.fixedBase(interval * _i6 + min, interval));
  128. }
  129. }
  130. return {
  131. max: max,
  132. min: min,
  133. interval: interval,
  134. ticks: ticks,
  135. count: ticks.length
  136. };
  137. };