177 lines
4.3 KiB
JavaScript
177 lines
4.3 KiB
JavaScript
/**
|
|
* @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
|
|
};
|
|
}; |