guy
6 years ago
72 changed files with 3803 additions and 4275 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -0,0 +1,22 @@ |
|||||||
|
/** |
||||||
|
* 对数组对象的扩展 |
||||||
|
* @class Array |
||||||
|
*/ |
||||||
|
_.extend(BI, { |
||||||
|
|
||||||
|
pushArray: function (sArray, array) { |
||||||
|
for (var i = 0; i < array.length; i++) { |
||||||
|
sArray.push(array[i]); |
||||||
|
} |
||||||
|
}, |
||||||
|
pushDistinct: function (sArray, obj) { |
||||||
|
if (!BI.contains(obj)) { |
||||||
|
sArray.push(obj); |
||||||
|
} |
||||||
|
}, |
||||||
|
pushDistinctArray: function (sArray, array) { |
||||||
|
for (var i = 0, len = array.length; i < len; i++) { |
||||||
|
sArray.pushDistinct(array[i]); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
@ -0,0 +1,218 @@ |
|||||||
|
/** Constants used for time computations */ |
||||||
|
BI.Date = BI.Date || {}; |
||||||
|
BI.Date.SECOND = 1000; |
||||||
|
BI.Date.MINUTE = 60 * BI.Date.SECOND; |
||||||
|
BI.Date.HOUR = 60 * BI.Date.MINUTE; |
||||||
|
BI.Date.DAY = 24 * BI.Date.HOUR; |
||||||
|
BI.Date.WEEK = 7 * BI.Date.DAY; |
||||||
|
|
||||||
|
_.extend(BI, { |
||||||
|
/** |
||||||
|
* 获取时区 |
||||||
|
* @returns {String} |
||||||
|
*/ |
||||||
|
getTimezone: function (date) { |
||||||
|
return date.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, ""); |
||||||
|
}, |
||||||
|
|
||||||
|
/** Returns the number of days in the current month */ |
||||||
|
getMonthDays: function (date, month) { |
||||||
|
var year = date.getFullYear(); |
||||||
|
if (typeof month === "undefined") { |
||||||
|
month = date.getMonth(); |
||||||
|
} |
||||||
|
if (((0 == (year % 4)) && ((0 != (year % 100)) || (0 == (year % 400)))) && month == 1) { |
||||||
|
return 29; |
||||||
|
} |
||||||
|
return BI.Date._MD[month]; |
||||||
|
|
||||||
|
}, |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取每月的最后一天 |
||||||
|
* @returns {Date} |
||||||
|
*/ |
||||||
|
getLastDateOfMonth: function (date) { |
||||||
|
return BI.getDate(date.getFullYear(), date.getMonth(), BI.getMonthDays(date)); |
||||||
|
}, |
||||||
|
|
||||||
|
/** Returns the number of day in the year. */ |
||||||
|
getDayOfYear: function (date) { |
||||||
|
var now = BI.getDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0); |
||||||
|
var then = BI.getDate(date.getFullYear(), 0, 0, 0, 0, 0); |
||||||
|
var time = now - then; |
||||||
|
return Math.floor(time / BI.Date.DAY); |
||||||
|
}, |
||||||
|
|
||||||
|
/** Returns the number of the week in year, as defined in ISO 8601. */ |
||||||
|
getWeekNumber: function (date) { |
||||||
|
var d = BI.getDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0); |
||||||
|
var week = d.getDay(); |
||||||
|
var startOfWeek = BI.StartOfWeek % 7; |
||||||
|
if (date.getMonth() === 0 && date.getDate() <= week) { |
||||||
|
return 1; |
||||||
|
} |
||||||
|
d.setDate(date.getDate() - (week < startOfWeek ? (7 + week - startOfWeek) : (week - startOfWeek))); |
||||||
|
var ms = d.valueOf(); // GMT
|
||||||
|
d.setMonth(0); |
||||||
|
d.setDate(1); |
||||||
|
var offset = Math.floor((ms - d.valueOf()) / (7 * 864e5)) + 1; |
||||||
|
if (d.getDay() !== startOfWeek) { |
||||||
|
offset++; |
||||||
|
} |
||||||
|
return offset; |
||||||
|
}, |
||||||
|
|
||||||
|
getQuarter: function (date) { |
||||||
|
return Math.floor(date.getMonth() / 3) + 1; |
||||||
|
}, |
||||||
|
|
||||||
|
// 离当前时间多少天的时间
|
||||||
|
getOffsetDate: function (date, offset) { |
||||||
|
return BI.getDate(BI.getTime(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()) + offset * 864e5); |
||||||
|
}, |
||||||
|
|
||||||
|
getOffsetQuarter: function (date, n) { |
||||||
|
var dt = BI.getDate(BI.getTime(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds())); |
||||||
|
var day = dt.getDate(); |
||||||
|
var monthDay = BI.getMonthDays(BI.getDate(dt.getFullYear(), dt.getMonth() + BI.parseInt(n) * 3, 1)); |
||||||
|
if (day > monthDay) { |
||||||
|
day = monthDay; |
||||||
|
} |
||||||
|
dt.setDate(day); |
||||||
|
dt.setMonth(dt.getMonth() + parseInt(n) * 3); |
||||||
|
return dt; |
||||||
|
}, |
||||||
|
|
||||||
|
// 得到本季度的起始月份
|
||||||
|
getQuarterStartMonth: function (date) { |
||||||
|
var quarterStartMonth = 0; |
||||||
|
var nowMonth = date.getMonth(); |
||||||
|
if (nowMonth < 3) { |
||||||
|
quarterStartMonth = 0; |
||||||
|
} |
||||||
|
if (2 < nowMonth && nowMonth < 6) { |
||||||
|
quarterStartMonth = 3; |
||||||
|
} |
||||||
|
if (5 < nowMonth && nowMonth < 9) { |
||||||
|
quarterStartMonth = 6; |
||||||
|
} |
||||||
|
if (nowMonth > 8) { |
||||||
|
quarterStartMonth = 9; |
||||||
|
} |
||||||
|
return quarterStartMonth; |
||||||
|
}, |
||||||
|
// 获得本季度的起始日期
|
||||||
|
getQuarterStartDate: function (date) { |
||||||
|
return BI.getDate(date.getFullYear(), BI.getQuarterStartMonth(date), 1); |
||||||
|
}, |
||||||
|
// 得到本季度的结束日期
|
||||||
|
getQuarterEndDate: function (date) { |
||||||
|
var quarterEndMonth = BI.getQuarterStartMonth(date) + 2; |
||||||
|
return BI.getDate(date.getFullYear(), quarterEndMonth, BI.getMonthDays(date, quarterEndMonth)); |
||||||
|
}, |
||||||
|
|
||||||
|
// 指定日期n个月之前或之后的日期
|
||||||
|
getOffsetMonth: function (date, n) { |
||||||
|
var dt = BI.getDate(BI.getTime(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds())); |
||||||
|
var day = dt.getDate(); |
||||||
|
var monthDay = BI.getMonthDays(BI.getDate(dt.getFullYear(), dt.getMonth() + parseInt(n), 1)); |
||||||
|
if (day > monthDay) { |
||||||
|
day = monthDay; |
||||||
|
} |
||||||
|
dt.setDate(day); |
||||||
|
dt.setMonth(dt.getMonth() + parseInt(n)); |
||||||
|
return dt; |
||||||
|
}, |
||||||
|
|
||||||
|
// 获得本周的起始日期
|
||||||
|
getWeekStartDate: function (date) { |
||||||
|
var w = date.getDay(); |
||||||
|
var startOfWeek = BI.StartOfWeek % 7; |
||||||
|
return BI.getOffsetDate(date, BI.Date._OFFSET[w < startOfWeek ? (7 + w - startOfWeek) : (w - startOfWeek)]); |
||||||
|
}, |
||||||
|
// 得到本周的结束日期
|
||||||
|
getWeekEndDate: function (date) { |
||||||
|
var w = date.getDay(); |
||||||
|
var startOfWeek = BI.StartOfWeek % 7; |
||||||
|
return BI.getOffsetDate(date, BI.Date._OFFSET[w < startOfWeek ? (7 + w - startOfWeek) : (w - startOfWeek)] + 6); |
||||||
|
}, |
||||||
|
|
||||||
|
// 格式化打印日期
|
||||||
|
print: function (date, str) { |
||||||
|
var m = date.getMonth(); |
||||||
|
var d = date.getDate(); |
||||||
|
var y = date.getFullYear(); |
||||||
|
var yWith4number = y + ""; |
||||||
|
while (yWith4number.length < 4) { |
||||||
|
yWith4number = "0" + yWith4number; |
||||||
|
} |
||||||
|
var wn = BI.getWeekNumber(date); |
||||||
|
var qr = BI.getQuarter(date); |
||||||
|
var w = date.getDay(); |
||||||
|
var s = {}; |
||||||
|
var hr = date.getHours(); |
||||||
|
var pm = (hr >= 12); |
||||||
|
var ir = (pm) ? (hr - 12) : hr; |
||||||
|
var dy = BI.getDayOfYear(date); |
||||||
|
if (ir == 0) { |
||||||
|
ir = 12; |
||||||
|
} |
||||||
|
var min = date.getMinutes(); |
||||||
|
var sec = date.getSeconds(); |
||||||
|
s["%a"] = BI.Date._SDN[w]; // abbreviated weekday name [FIXME: I18N]
|
||||||
|
s["%A"] = BI.Date._DN[w]; // full weekday name
|
||||||
|
s["%b"] = BI.Date._SMN[m]; // abbreviated month name [FIXME: I18N]
|
||||||
|
s["%B"] = BI.Date._MN[m]; // full month name
|
||||||
|
// FIXME: %c : preferred date and time representation for the current locale
|
||||||
|
s["%C"] = 1 + Math.floor(y / 100); // the century number
|
||||||
|
s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31)
|
||||||
|
s["%e"] = d; // the day of the month (range 1 to 31)
|
||||||
|
// FIXME: %D : american date style: %m/%d/%y
|
||||||
|
// FIXME: %E, %F, %G, %g, %h (man strftime)
|
||||||
|
s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format)
|
||||||
|
s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format)
|
||||||
|
s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366)
|
||||||
|
s["%k"] = hr; // hour, range 0 to 23 (24h format)
|
||||||
|
s["%l"] = ir; // hour, range 1 to 12 (12h format)
|
||||||
|
s["%X"] = (m < 9) ? ("0" + (1 + m)) : (1 + m); // month, range 01 to 12
|
||||||
|
s["%x"] = m + 1; // month, range 1 to 12
|
||||||
|
s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59
|
||||||
|
s["%n"] = "\n"; // a newline character
|
||||||
|
s["%p"] = pm ? "PM" : "AM"; |
||||||
|
s["%P"] = pm ? "pm" : "am"; |
||||||
|
// FIXME: %r : the time in am/pm notation %I:%M:%S %p
|
||||||
|
// FIXME: %R : the time in 24-hour notation %H:%M
|
||||||
|
s["%s"] = Math.floor(date.getTime() / 1000); |
||||||
|
s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59
|
||||||
|
s["%t"] = "\t"; // a tab character
|
||||||
|
// FIXME: %T : the time in 24-hour notation (%H:%M:%S)
|
||||||
|
s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn; |
||||||
|
s["%u"] = w + 1; // the day of the week (range 1 to 7, 1 = MON)
|
||||||
|
s["%w"] = w; // the day of the week (range 0 to 6, 0 = SUN)
|
||||||
|
// FIXME: %x : preferred date representation for the current locale without the time
|
||||||
|
// FIXME: %X : preferred time representation for the current locale without the date
|
||||||
|
s["%y"] = yWith4number.substr(2, 2); // year without the century (range 00 to 99)
|
||||||
|
s["%Y"] = yWith4number; // year with the century
|
||||||
|
s["%%"] = "%"; // a literal '%' character
|
||||||
|
s["%Q"] = qr; |
||||||
|
|
||||||
|
var re = /%./g; |
||||||
|
if (!BI.isKhtml()) { |
||||||
|
return str.replace(re, function (par) { |
||||||
|
return s[par] || par; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
var a = str.match(re); |
||||||
|
for (var i = 0; i < a.length; i++) { |
||||||
|
var tmp = s[a[i]]; |
||||||
|
if (tmp) { |
||||||
|
re = new RegExp(a[i], "g"); |
||||||
|
str = str.replace(re, tmp); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return str; |
||||||
|
} |
||||||
|
}); |
@ -0,0 +1,156 @@ |
|||||||
|
_.extend(BI, { |
||||||
|
// 给Number类型增加一个add方法,调用起来更加方便。
|
||||||
|
add: function (num, arg) { |
||||||
|
return accAdd(arg, num); |
||||||
|
|
||||||
|
/** |
||||||
|
** 加法函数,用来得到精确的加法结果 |
||||||
|
** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 |
||||||
|
** 调用:accAdd(arg1,arg2) |
||||||
|
** 返回值:arg1加上arg2的精确结果 |
||||||
|
**/ |
||||||
|
function accAdd (arg1, arg2) { |
||||||
|
var r1, r2, m, c; |
||||||
|
try { |
||||||
|
r1 = arg1.toString().split(".")[1].length; |
||||||
|
} catch (e) { |
||||||
|
r1 = 0; |
||||||
|
} |
||||||
|
try { |
||||||
|
r2 = arg2.toString().split(".")[1].length; |
||||||
|
} catch (e) { |
||||||
|
r2 = 0; |
||||||
|
} |
||||||
|
c = Math.abs(r1 - r2); |
||||||
|
m = Math.pow(10, Math.max(r1, r2)); |
||||||
|
if (c > 0) { |
||||||
|
var cm = Math.pow(10, c); |
||||||
|
if (r1 > r2) { |
||||||
|
arg1 = Number(arg1.toString().replace(".", "")); |
||||||
|
arg2 = Number(arg2.toString().replace(".", "")) * cm; |
||||||
|
} else { |
||||||
|
arg1 = Number(arg1.toString().replace(".", "")) * cm; |
||||||
|
arg2 = Number(arg2.toString().replace(".", "")); |
||||||
|
} |
||||||
|
} else { |
||||||
|
arg1 = Number(arg1.toString().replace(".", "")); |
||||||
|
arg2 = Number(arg2.toString().replace(".", "")); |
||||||
|
} |
||||||
|
return (arg1 + arg2) / m; |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
// 给Number类型增加一个sub方法,调用起来更加方便。
|
||||||
|
sub: function (num, arg) { |
||||||
|
return accSub(num, arg); |
||||||
|
|
||||||
|
/** |
||||||
|
** 减法函数,用来得到精确的减法结果 |
||||||
|
** 说明:javascript的减法结果会有误差,在两个浮点数相减的时候会比较明显。这个函数返回较为精确的减法结果。 |
||||||
|
** 调用:accSub(arg1,arg2) |
||||||
|
** 返回值:arg1加上arg2的精确结果 |
||||||
|
**/ |
||||||
|
function accSub (arg1, arg2) { |
||||||
|
var r1, r2, m, n; |
||||||
|
try { |
||||||
|
r1 = arg1.toString().split(".")[1].length; |
||||||
|
} catch (e) { |
||||||
|
r1 = 0; |
||||||
|
} |
||||||
|
try { |
||||||
|
r2 = arg2.toString().split(".")[1].length; |
||||||
|
} catch (e) { |
||||||
|
r2 = 0; |
||||||
|
} |
||||||
|
m = Math.pow(10, Math.max(r1, r2)); // last modify by deeka //动态控制精度长度
|
||||||
|
n = (r1 >= r2) ? r1 : r2; |
||||||
|
return ((arg1 * m - arg2 * m) / m).toFixed(n); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
// 给Number类型增加一个mul方法,调用起来更加方便。
|
||||||
|
mul: function (num, arg) { |
||||||
|
return accMul(arg, num); |
||||||
|
|
||||||
|
/** |
||||||
|
** 乘法函数,用来得到精确的乘法结果 |
||||||
|
** 说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。 |
||||||
|
** 调用:accMul(arg1,arg2) |
||||||
|
** 返回值:arg1乘以 arg2的精确结果 |
||||||
|
**/ |
||||||
|
function accMul (arg1, arg2) { |
||||||
|
var m = 0, s1 = arg1.toString(), s2 = arg2.toString(); |
||||||
|
try { |
||||||
|
m += s1.split(".")[1].length; |
||||||
|
} catch (e) { |
||||||
|
} |
||||||
|
try { |
||||||
|
m += s2.split(".")[1].length; |
||||||
|
} catch (e) { |
||||||
|
} |
||||||
|
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
// 给Number类型增加一个div方法,调用起来更加方便。
|
||||||
|
div: function (num, arg) { |
||||||
|
return accDivide(num, arg); |
||||||
|
|
||||||
|
/** |
||||||
|
* Return digits length of a number |
||||||
|
* @param {*number} num Input number |
||||||
|
*/ |
||||||
|
function digitLength (num) { |
||||||
|
// Get digit length of e
|
||||||
|
var eSplit = num.toString().split(/[eE]/); |
||||||
|
var len = (eSplit[0].split(".")[1] || "").length - (+(eSplit[1] || 0)); |
||||||
|
return len > 0 ? len : 0; |
||||||
|
} |
||||||
|
/** |
||||||
|
* 把小数转成整数,支持科学计数法。如果是小数则放大成整数 |
||||||
|
* @param {*number} num 输入数 |
||||||
|
*/ |
||||||
|
function float2Fixed (num) { |
||||||
|
if (num.toString().indexOf("e") === -1) { |
||||||
|
return Number(num.toString().replace(".", "")); |
||||||
|
} |
||||||
|
var dLen = digitLength(num); |
||||||
|
return dLen > 0 ? num * Math.pow(10, dLen) : num; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 精确乘法 |
||||||
|
*/ |
||||||
|
function times (num1, num2) { |
||||||
|
var others = []; |
||||||
|
for (var _i = 2; _i < arguments.length; _i++) { |
||||||
|
others[_i - 2] = arguments[_i]; |
||||||
|
} |
||||||
|
if (others.length > 0) { |
||||||
|
return times.apply(void 0, [times(num1, num2), others[0]].concat(others.slice(1))); |
||||||
|
} |
||||||
|
var num1Changed = float2Fixed(num1); |
||||||
|
var num2Changed = float2Fixed(num2); |
||||||
|
var baseNum = digitLength(num1) + digitLength(num2); |
||||||
|
var leftValue = num1Changed * num2Changed; |
||||||
|
return leftValue / Math.pow(10, baseNum); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 精确除法 |
||||||
|
*/ |
||||||
|
function accDivide (num1, num2) { |
||||||
|
var others = []; |
||||||
|
for (var _i = 2; _i < arguments.length; _i++) { |
||||||
|
others[_i - 2] = arguments[_i]; |
||||||
|
} |
||||||
|
if (others.length > 0) { |
||||||
|
return accDivide.apply(void 0, [accDivide(num1, num2), others[0]].concat(others.slice(1))); |
||||||
|
} |
||||||
|
var num1Changed = float2Fixed(num1); |
||||||
|
var num2Changed = float2Fixed(num2); |
||||||
|
return times((num1Changed / num2Changed), Math.pow(10, digitLength(num2) - digitLength(num1))); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
}); |
@ -1,38 +0,0 @@ |
|||||||
/** |
|
||||||
* 对数组对象的扩展 |
|
||||||
* @class Array |
|
||||||
*/ |
|
||||||
_.extend(Array.prototype, { |
|
||||||
contains: function (o) { |
|
||||||
return this.indexOf(o) > -1; |
|
||||||
}, |
|
||||||
|
|
||||||
/** |
|
||||||
* 从数组中移除指定的值,如果值不在数组中,则不产生任何效果 |
|
||||||
* @param {Object} o 要移除的值 |
|
||||||
* @return {Array} 移除制定值后的数组 |
|
||||||
*/ |
|
||||||
remove: function (o) { |
|
||||||
var index = this.indexOf(o); |
|
||||||
if (index !== -1) { |
|
||||||
this.splice(index, 1); |
|
||||||
} |
|
||||||
return this; |
|
||||||
}, |
|
||||||
|
|
||||||
pushArray: function (array) { |
|
||||||
for (var i = 0; i < array.length; i++) { |
|
||||||
this.push(array[i]); |
|
||||||
} |
|
||||||
}, |
|
||||||
pushDistinct: function (obj) { |
|
||||||
if (!this.contains(obj)) { |
|
||||||
this.push(obj); |
|
||||||
} |
|
||||||
}, |
|
||||||
pushDistinctArray: function (array) { |
|
||||||
for (var i = 0, len = array.length; i < len; i++) { |
|
||||||
this.pushDistinct(array[i]); |
|
||||||
} |
|
||||||
} |
|
||||||
}); |
|
@ -1,216 +0,0 @@ |
|||||||
|
|
||||||
/** Constants used for time computations */ |
|
||||||
Date.SECOND = 1000; |
|
||||||
Date.MINUTE = 60 * Date.SECOND; |
|
||||||
Date.HOUR = 60 * Date.MINUTE; |
|
||||||
Date.DAY = 24 * Date.HOUR; |
|
||||||
Date.WEEK = 7 * Date.DAY; |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取时区 |
|
||||||
* @returns {String} |
|
||||||
*/ |
|
||||||
Date.prototype.getTimezone = function () { |
|
||||||
return this.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, ""); |
|
||||||
}; |
|
||||||
|
|
||||||
/** Returns the number of days in the current month */ |
|
||||||
Date.prototype.getMonthDays = function (month) { |
|
||||||
var year = this.getFullYear(); |
|
||||||
if (typeof month === "undefined") { |
|
||||||
month = this.getMonth(); |
|
||||||
} |
|
||||||
if (((0 == (year % 4)) && ( (0 != (year % 100)) || (0 == (year % 400)))) && month == 1) { |
|
||||||
return 29; |
|
||||||
} |
|
||||||
return Date._MD[month]; |
|
||||||
|
|
||||||
}; |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取每月的最后一天 |
|
||||||
* @returns {Date} |
|
||||||
*/ |
|
||||||
Date.prototype.getLastDateOfMonth = function () { |
|
||||||
return BI.getDate(this.getFullYear(), this.getMonth(), this.getMonthDays()); |
|
||||||
}; |
|
||||||
|
|
||||||
/** Returns the number of day in the year. */ |
|
||||||
Date.prototype.getDayOfYear = function () { |
|
||||||
var now = BI.getDate(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); |
|
||||||
var then = BI.getDate(this.getFullYear(), 0, 0, 0, 0, 0); |
|
||||||
var time = now - then; |
|
||||||
return Math.floor(time / Date.DAY); |
|
||||||
}; |
|
||||||
|
|
||||||
/** Returns the number of the week in year, as defined in ISO 8601. */ |
|
||||||
Date.prototype.getWeekNumber = function () { |
|
||||||
var d = BI.getDate(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); |
|
||||||
var week = d.getDay(); |
|
||||||
var startOfWeek = BI.StartOfWeek % 7; |
|
||||||
if (this.getMonth() === 0 && this.getDate() <= week) { |
|
||||||
return 1; |
|
||||||
} |
|
||||||
d.setDate(this.getDate() - (week < startOfWeek ? (7 + week - startOfWeek) : (week - startOfWeek))); |
|
||||||
var ms = d.valueOf(); // GMT
|
|
||||||
d.setMonth(0); |
|
||||||
d.setDate(1); |
|
||||||
var offset = Math.floor((ms - d.valueOf()) / (7 * 864e5)) + 1; |
|
||||||
if (d.getDay() !== startOfWeek) { |
|
||||||
offset++; |
|
||||||
} |
|
||||||
return offset; |
|
||||||
}; |
|
||||||
|
|
||||||
Date.prototype.getQuarter = function () { |
|
||||||
return Math.floor(this.getMonth() / 3) + 1; |
|
||||||
}; |
|
||||||
|
|
||||||
// 离当前时间多少天的时间
|
|
||||||
Date.prototype.getOffsetDate = function (offset) { |
|
||||||
return BI.getDate(BI.getTime(this.getFullYear(), this.getMonth(), this.getDate(), this.getHours(), this.getMinutes(), this.getSeconds()) + offset * 864e5); |
|
||||||
}; |
|
||||||
|
|
||||||
Date.prototype.getOffsetQuarter = function (n) { |
|
||||||
var dt = BI.getDate(BI.getTime(this.getFullYear(), this.getMonth(), this.getDate(), this.getHours(), this.getMinutes(), this.getSeconds())); |
|
||||||
var day = dt.getDate(); |
|
||||||
var monthDay = BI.getDate(dt.getFullYear(), dt.getMonth() + BI.parseInt(n) * 3, 1).getMonthDays(); |
|
||||||
if (day > monthDay) { |
|
||||||
day = monthDay; |
|
||||||
} |
|
||||||
dt.setDate(day); |
|
||||||
dt.setMonth(dt.getMonth() + parseInt(n) * 3); |
|
||||||
return dt; |
|
||||||
}; |
|
||||||
|
|
||||||
// 得到本季度的起始月份
|
|
||||||
Date.prototype.getQuarterStartMonth = function () { |
|
||||||
var quarterStartMonth = 0; |
|
||||||
var nowMonth = this.getMonth(); |
|
||||||
if (nowMonth < 3) { |
|
||||||
quarterStartMonth = 0; |
|
||||||
} |
|
||||||
if (2 < nowMonth && nowMonth < 6) { |
|
||||||
quarterStartMonth = 3; |
|
||||||
} |
|
||||||
if (5 < nowMonth && nowMonth < 9) { |
|
||||||
quarterStartMonth = 6; |
|
||||||
} |
|
||||||
if (nowMonth > 8) { |
|
||||||
quarterStartMonth = 9; |
|
||||||
} |
|
||||||
return quarterStartMonth; |
|
||||||
}; |
|
||||||
// 获得本季度的起始日期
|
|
||||||
Date.prototype.getQuarterStartDate = function () { |
|
||||||
return BI.getDate(this.getFullYear(), this.getQuarterStartMonth(), 1); |
|
||||||
}; |
|
||||||
// 得到本季度的结束日期
|
|
||||||
Date.prototype.getQuarterEndDate = function () { |
|
||||||
var quarterEndMonth = this.getQuarterStartMonth() + 2; |
|
||||||
return BI.getDate(this.getFullYear(), quarterEndMonth, this.getMonthDays(quarterEndMonth)); |
|
||||||
}; |
|
||||||
|
|
||||||
// 指定日期n个月之前或之后的日期
|
|
||||||
Date.prototype.getOffsetMonth = function (n) { |
|
||||||
var dt = BI.getDate(BI.getTime(this.getFullYear(), this.getMonth(), this.getDate(), this.getHours(), this.getMinutes(), this.getSeconds())); |
|
||||||
var day = dt.getDate(); |
|
||||||
var monthDay = BI.getDate(dt.getFullYear(), dt.getMonth() + parseInt(n), 1).getMonthDays(); |
|
||||||
if (day > monthDay) { |
|
||||||
day = monthDay; |
|
||||||
} |
|
||||||
dt.setDate(day); |
|
||||||
dt.setMonth(dt.getMonth() + parseInt(n)); |
|
||||||
return dt; |
|
||||||
}; |
|
||||||
|
|
||||||
// 获得本周的起始日期
|
|
||||||
Date.prototype.getWeekStartDate = function () { |
|
||||||
var w = this.getDay(); |
|
||||||
var startOfWeek = BI.StartOfWeek % 7; |
|
||||||
return this.getOffsetDate(Date._OFFSET[w < startOfWeek ? (7 + w - startOfWeek) : (w - startOfWeek)]); |
|
||||||
}; |
|
||||||
// 得到本周的结束日期
|
|
||||||
Date.prototype.getWeekEndDate = function () { |
|
||||||
var w = this.getDay(); |
|
||||||
var startOfWeek = BI.StartOfWeek % 7; |
|
||||||
return this.getOffsetDate(Date._OFFSET[w < startOfWeek ? (7 + w - startOfWeek) : (w - startOfWeek)] + 6); |
|
||||||
}; |
|
||||||
|
|
||||||
// 格式化打印日期
|
|
||||||
Date.prototype.print = function (str) { |
|
||||||
var m = this.getMonth(); |
|
||||||
var d = this.getDate(); |
|
||||||
var y = this.getFullYear(); |
|
||||||
var yWith4number = y + ""; |
|
||||||
while (yWith4number.length < 4) { |
|
||||||
yWith4number = "0" + yWith4number; |
|
||||||
} |
|
||||||
var wn = this.getWeekNumber(); |
|
||||||
var qr = this.getQuarter(); |
|
||||||
var w = this.getDay(); |
|
||||||
var s = {}; |
|
||||||
var hr = this.getHours(); |
|
||||||
var pm = (hr >= 12); |
|
||||||
var ir = (pm) ? (hr - 12) : hr; |
|
||||||
var dy = this.getDayOfYear(); |
|
||||||
if (ir == 0) { |
|
||||||
ir = 12; |
|
||||||
} |
|
||||||
var min = this.getMinutes(); |
|
||||||
var sec = this.getSeconds(); |
|
||||||
s["%a"] = Date._SDN[w]; // abbreviated weekday name [FIXME: I18N]
|
|
||||||
s["%A"] = Date._DN[w]; // full weekday name
|
|
||||||
s["%b"] = Date._SMN[m]; // abbreviated month name [FIXME: I18N]
|
|
||||||
s["%B"] = Date._MN[m]; // full month name
|
|
||||||
// FIXME: %c : preferred date and time representation for the current locale
|
|
||||||
s["%C"] = 1 + Math.floor(y / 100); // the century number
|
|
||||||
s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31)
|
|
||||||
s["%e"] = d; // the day of the month (range 1 to 31)
|
|
||||||
// FIXME: %D : american date style: %m/%d/%y
|
|
||||||
// FIXME: %E, %F, %G, %g, %h (man strftime)
|
|
||||||
s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format)
|
|
||||||
s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format)
|
|
||||||
s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366)
|
|
||||||
s["%k"] = hr; // hour, range 0 to 23 (24h format)
|
|
||||||
s["%l"] = ir; // hour, range 1 to 12 (12h format)
|
|
||||||
s["%X"] = (m < 9) ? ("0" + (1 + m)) : (1 + m); // month, range 01 to 12
|
|
||||||
s["%x"] = m + 1; // month, range 1 to 12
|
|
||||||
s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59
|
|
||||||
s["%n"] = "\n"; // a newline character
|
|
||||||
s["%p"] = pm ? "PM" : "AM"; |
|
||||||
s["%P"] = pm ? "pm" : "am"; |
|
||||||
// FIXME: %r : the time in am/pm notation %I:%M:%S %p
|
|
||||||
// FIXME: %R : the time in 24-hour notation %H:%M
|
|
||||||
s["%s"] = Math.floor(this.getTime() / 1000); |
|
||||||
s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59
|
|
||||||
s["%t"] = "\t"; // a tab character
|
|
||||||
// FIXME: %T : the time in 24-hour notation (%H:%M:%S)
|
|
||||||
s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn; |
|
||||||
s["%u"] = w + 1; // the day of the week (range 1 to 7, 1 = MON)
|
|
||||||
s["%w"] = w; // the day of the week (range 0 to 6, 0 = SUN)
|
|
||||||
// FIXME: %x : preferred date representation for the current locale without the time
|
|
||||||
// FIXME: %X : preferred time representation for the current locale without the date
|
|
||||||
s["%y"] = yWith4number.substr(2, 2); // year without the century (range 00 to 99)
|
|
||||||
s["%Y"] = yWith4number; // year with the century
|
|
||||||
s["%%"] = "%"; // a literal '%' character
|
|
||||||
s["%Q"] = qr; |
|
||||||
|
|
||||||
var re = /%./g; |
|
||||||
if (!BI.isKhtml()) { |
|
||||||
return str.replace(re, function (par) { |
|
||||||
return s[par] || par; |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
var a = str.match(re); |
|
||||||
for (var i = 0; i < a.length; i++) { |
|
||||||
var tmp = s[a[i]]; |
|
||||||
if (tmp) { |
|
||||||
re = new RegExp(a[i], "g"); |
|
||||||
str = str.replace(re, tmp); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return str; |
|
||||||
}; |
|
@ -1,21 +0,0 @@ |
|||||||
Function.prototype.before = function (func) { |
|
||||||
var __self = this; |
|
||||||
return function () { |
|
||||||
if (func.apply(this, arguments) === false) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
return __self.apply(this, arguments); |
|
||||||
}; |
|
||||||
}; |
|
||||||
|
|
||||||
Function.prototype.after = function (func) { |
|
||||||
var __self = this; |
|
||||||
return function () { |
|
||||||
var ret = __self.apply(this, arguments); |
|
||||||
if (ret === false) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
func.apply(this, arguments); |
|
||||||
return ret; |
|
||||||
}; |
|
||||||
}; |
|
Loading…
Reference in new issue