/** * 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 }; });