123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- /**
- * @fileOverview 计算时间坐标轴
- * @author dxq613@gmail.com
- */
- var AutoUtil = require('./util');
- var isNil = require('@antv/util/lib/type/is-nil');
- var MAX_COUNT = 6;
- var SNAP_ARRAY = [1, 2, 4, 6, 8, 12];
- var MINUTE_MS = 60 * 1000;
- var HOUR_MS = 3600 * 1000;
- var DAY_MS = 24 * 3600 * 1000;
- function getYear(date) {
- return new Date(date).getFullYear();
- }
- function createYear(year) {
- return new Date(year, 0, 1).getTime();
- }
- function getMonth(date) {
- return new Date(date).getMonth();
- }
- function diffMonth(min, max) {
- var minYear = getYear(min);
- var maxYear = getYear(max);
- var minMonth = getMonth(min);
- var maxMonth = getMonth(max);
- return (maxYear - minYear) * 12 + (maxMonth - minMonth) % 12;
- }
- function creatMonth(year, month) {
- return new Date(year, month, 1).getTime();
- }
- function diffDay(min, max) {
- return Math.ceil((max - min) / DAY_MS);
- }
- function diffHour(min, max) {
- return Math.ceil((max - min) / HOUR_MS);
- }
- function diffMinus(min, max) {
- return Math.ceil((max - min) / (60 * 1000));
- }
- module.exports = function (info) {
- var minInterval = info.minInterval;
- var ticks = [];
- var min = info.min;
- var max = info.max;
- var interval = info.interval;
- var count; // 如果最大值和最小值相等,则设置最大值大于最小值一天
- if (max === min) {
- max = min + DAY_MS;
- } // 计算间距
- if (isNil(interval)) {
- var innerTime = max - min;
- var dms = DAY_MS; // 天代表的秒
- var yms = 365 * dms; // 年代表的秒
- interval = parseInt(innerTime / (info.maxCount || MAX_COUNT), 10);
- if (minInterval && minInterval > interval) {
- interval = minInterval;
- }
- var yfactor = interval / yms;
- var minYear = getYear(min); // 大于半年
- if (yfactor > 0.51) {
- var year = Math.ceil(yfactor); // interval = year * yms;
- var maxYear = getYear(max);
- for (var i = minYear; i <= maxYear + year; i = i + year) {
- ticks.push(createYear(i));
- }
- interval = null;
- } else if (yfactor > 0.0834) {
- // 大于一个月
- var month = Math.ceil(yfactor / 0.0834);
- var mmMoth = getMonth(min);
- var dMonths = diffMonth(min, max);
- for (var _i = 0; _i <= dMonths + month; _i = _i + month) {
- ticks.push(creatMonth(minYear, _i + mmMoth));
- }
- interval = null;
- } else if (interval > dms * 0.5) {
- // 大于一天
- var date = new Date(min);
- var _year = date.getFullYear();
- var _month = date.getMonth(min);
- var mday = date.getDate();
- var day = Math.ceil(interval / dms);
- var ddays = diffDay(min, max);
- interval = day * dms;
- for (var _i2 = 0; _i2 < ddays + day; _i2 = _i2 + day) {
- ticks.push(new Date(_year, _month, mday + _i2).getTime());
- }
- } else if (interval > HOUR_MS) {
- // 大于一个小时
- var _date = new Date(min);
- var _year2 = _date.getFullYear();
- var _month2 = _date.getMonth(min);
- var _day = _date.getDate();
- var hour = _date.getHours();
- var hours = AutoUtil.snapTo(SNAP_ARRAY, Math.ceil(interval / HOUR_MS));
- var dHours = diffHour(min, max);
- interval = hours * HOUR_MS;
- for (var _i3 = 0; _i3 <= dHours + hours; _i3 = _i3 + hours) {
- ticks.push(new Date(_year2, _month2, _day, hour + _i3).getTime());
- }
- } else if (interval > MINUTE_MS) {
- // 最小单位是分钟
- var dMinus = diffMinus(min, max);
- var minutes = Math.ceil(interval / MINUTE_MS);
- interval = minutes * MINUTE_MS;
- for (var _i4 = 0; _i4 <= dMinus + minutes; _i4 = _i4 + minutes) {
- ticks.push(min + _i4 * MINUTE_MS);
- }
- } else {
- if (interval < 1000) {
- interval = 1000;
- }
- min = Math.floor(min / 1000) * 1000;
- var dSeconds = Math.ceil((max - min) / 1000);
- var seconds = Math.ceil(interval / 1000);
- interval = seconds * 1000;
- for (var _i5 = 0; _i5 < dSeconds + seconds; _i5 = _i5 + seconds) {
- ticks.push(min + _i5 * 1000);
- }
- }
- }
- if (!ticks.length) {
- min = Math.floor(min / 1000) * 1000;
- max = Math.ceil(max / 1000) * 1000;
- count = (max - min) / interval;
- for (var _i6 = 0; _i6 <= count; _i6++) {
- ticks.push(AutoUtil.fixedBase(interval * _i6 + min, interval));
- }
- }
- return {
- max: max,
- min: min,
- interval: interval,
- ticks: ticks,
- count: ticks.length
- };
- };
|