UNPKG

4.39 kBJavaScriptView Raw
1import { DAY, HOUR, MINUTE, MONTH, SECOND, YEAR } from '../util/time';
2function getYear(date) {
3 return new Date(date).getFullYear();
4}
5function createYear(year) {
6 return new Date(year, 0, 1).getTime();
7}
8function getMonth(date) {
9 return new Date(date).getMonth();
10}
11function 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}
18function creatMonth(year, month) {
19 return new Date(year, month, 1).getTime();
20}
21function diffDay(min, max) {
22 return Math.ceil((max - min) / DAY);
23}
24function diffHour(min, max) {
25 return Math.ceil((max - min) / HOUR);
26}
27function 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 */
35export 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
\No newline at end of file