123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- /**
- * echarts日期运算格式化相关
- *
- * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。
- * @author Kener (@Kener-林峰, kener.linfeng@gmail.com)
- *
- */
- define(function() {
- var _timeGap = [
- {formatter: 'hh : mm : ss', value: 1000}, // 1s
- {formatter: 'hh : mm : ss', value: 1000 * 5}, // 5s
- {formatter: 'hh : mm : ss', value: 1000 * 10}, // 10s
- {formatter: 'hh : mm : ss', value: 1000 * 15}, // 15s
- {formatter: 'hh : mm : ss', value: 1000 * 30}, // 30s
- {formatter: 'hh : mm\nMM - dd', value: 60000}, // 1m
- {formatter: 'hh : mm\nMM - dd', value: 60000 * 5}, // 5m
- {formatter: 'hh : mm\nMM - dd', value: 60000 * 10}, // 10m
- {formatter: 'hh : mm\nMM - dd', value: 60000 * 15}, // 15m
- {formatter: 'hh : mm\nMM - dd', value: 60000 * 30}, // 30m
- {formatter: 'hh : mm\nMM - dd', value: 3600000}, // 1h
- {formatter: 'hh : mm\nMM - dd', value: 3600000 * 2}, // 2h
- {formatter: 'hh : mm\nMM - dd', value: 3600000 * 6}, // 6h
- {formatter: 'hh : mm\nMM - dd', value: 3600000 * 12}, // 12h
- {formatter: 'MM - dd\nyyyy', value: 3600000 * 24}, // 1d
- {formatter: 'week', value: 3600000 * 24 * 7}, // 7d
- {formatter: 'month', value: 3600000 * 24 * 31}, // 1M
- {formatter: 'quarter', value: 3600000 * 24 * 380 / 4}, // 3M
- {formatter: 'half-year', value: 3600000 * 24 * 380 / 2},// 6M
- {formatter: 'year', value: 3600000 * 24 * 380} // 1Y
- ];
-
- /**
- * 获取最佳formatter
- * @params {number} min 最小值
- * @params {number} max 最大值
- * @params {=number} splitNumber 分隔段数
- */
- function getAutoFormatter(min, max, splitNumber) {
- splitNumber = splitNumber > 1 ? splitNumber : 2;
- // 最优解
- var curValue;
- var totalGap;
- // 目标
- var formatter;
- var gapValue;
- for (var i = 0, l = _timeGap.length; i < l; i++) {
- curValue = _timeGap[i].value;
- totalGap = Math.ceil(max / curValue) * curValue
- - Math.floor(min / curValue) * curValue;
- if (Math.round(totalGap / curValue) <= splitNumber * 1.2) {
- formatter = _timeGap[i].formatter;
- gapValue = _timeGap[i].value;
- // console.log(formatter, gapValue,i);
- break;
- }
- }
-
- if (formatter == null) {
- formatter = 'year';
- curValue = 3600000 * 24 * 367;
- totalGap = Math.ceil(max / curValue) * curValue
- - Math.floor(min / curValue) * curValue;
- gapValue = Math.round(totalGap / (splitNumber - 1) / curValue) * curValue;
- }
-
- return {
- formatter: formatter,
- gapValue: gapValue
- };
- }
-
- /**
- * 一位数字补0
- */
- function s2d (v) {
- return v < 10 ? ('0' + v) : v;
- }
-
- /**
- * 百分比计算
- */
- function format(formatter, value) {
- if (formatter == 'week'
- || formatter == 'month'
- || formatter == 'quarter'
- || formatter == 'half-year'
- || formatter == 'year'
- ) {
- formatter = 'MM - dd\nyyyy';
- }
-
- var date = getNewDate(value);
- var y = date.getFullYear();
- var M = date.getMonth() + 1;
- var d = date.getDate();
- var h = date.getHours();
- var m = date.getMinutes();
- var s = date.getSeconds();
-
- formatter = formatter.replace('MM', s2d(M));
- formatter = formatter.toLowerCase();
- formatter = formatter.replace('yyyy', y);
- formatter = formatter.replace('yy', y % 100);
- formatter = formatter.replace('dd', s2d(d));
- formatter = formatter.replace('d', d);
- formatter = formatter.replace('hh', s2d(h));
- formatter = formatter.replace('h', h);
- formatter = formatter.replace('mm', s2d(m));
- formatter = formatter.replace('m', m);
- formatter = formatter.replace('ss', s2d(s));
- formatter = formatter.replace('s', s);
- return formatter;
- }
-
- function nextMonday(value) {
- value = getNewDate(value);
- value.setDate(value.getDate() + 8 - value.getDay());
- return value;
- }
-
- function nextNthPerNmonth(value, nth, nmon) {
- value = getNewDate(value);
- value.setMonth(Math.ceil((value.getMonth() + 1) / nmon) * nmon);
- value.setDate(nth);
- return value;
- }
-
- function nextNthOnMonth(value, nth) {
- return nextNthPerNmonth(value, nth, 1);
- }
-
- function nextNthOnQuarterYear(value, nth) {
- return nextNthPerNmonth(value, nth, 3);
- }
-
- function nextNthOnHalfYear(value, nth) {
- return nextNthPerNmonth(value, nth, 6);
- }
-
- function nextNthOnYear(value, nth) {
- return nextNthPerNmonth(value, nth, 12);
- }
-
- function getNewDate(value) {
- return value instanceof Date
- ? value
- : new Date(typeof value == 'string' ? value.replace(/-/g, '/') : value);
- }
-
- return {
- getAutoFormatter: getAutoFormatter,
- getNewDate: getNewDate,
- format: format,
- nextMonday: nextMonday,
- nextNthPerNmonth: nextNthPerNmonth,
- nextNthOnMonth: nextNthOnMonth,
- nextNthOnQuarterYear: nextNthOnQuarterYear,
- nextNthOnHalfYear: nextNthOnHalfYear,
- nextNthOnYear : nextNthOnYear
- };
- });
|