2026-01-29 18:39:46 +08:00
|
|
|
/***
|
|
|
|
|
* 扩展String对象
|
|
|
|
|
*/
|
|
|
|
|
;(function(){
|
|
|
|
|
|
|
|
|
|
String.is = function(obj){
|
|
|
|
|
return Object.prototype.toString.call(obj) == "[object String]";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String.prototype.startWith = function(str){
|
|
|
|
|
if(str==undefined) return false;
|
|
|
|
|
if(str.length > this.length) return false;
|
|
|
|
|
for (let i = 0; i < str.length; i++) {
|
|
|
|
|
if(str.charCodeAt(i)!=this.charCodeAt(i)){
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String.prototype.endWith = function(str){
|
|
|
|
|
if(str==undefined) return false;
|
|
|
|
|
if(str.length > this.length) return false;
|
|
|
|
|
var j = this.length - str.length;
|
|
|
|
|
for (let i = 0; i < str.length; i++) {
|
|
|
|
|
if(str.charCodeAt(i)!=this.charCodeAt(i+j)){
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 扩展Number对象
|
|
|
|
|
*/
|
|
|
|
|
;(function(){
|
|
|
|
|
Number.is = function(obj){
|
|
|
|
|
return Object.prototype.toString.call(obj) == "[object Number]";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Number.format = function(num,fmt){
|
2026-01-30 17:39:21 +08:00
|
|
|
const sign = num < 0 ? '-' : '';
|
|
|
|
|
const absNum = Math.abs(num);
|
2026-01-29 18:39:46 +08:00
|
|
|
var fmts = fmt.split(".");
|
|
|
|
|
var format = {
|
|
|
|
|
int:fmts[0].split("").reverse(),
|
|
|
|
|
scale:fmts[1]!=undefined?fmts[1].split(""):undefined
|
|
|
|
|
}
|
2026-01-30 17:39:21 +08:00
|
|
|
var numsp = (absNum+"").split(".");
|
2026-01-29 18:39:46 +08:00
|
|
|
var numinfo = {
|
|
|
|
|
int:numsp[0].split("").reverse(),
|
|
|
|
|
scale:numsp[1]!=undefined?numsp[1].split(""):undefined
|
|
|
|
|
}
|
|
|
|
|
var res = {
|
|
|
|
|
int:[],
|
|
|
|
|
scale:undefined
|
|
|
|
|
}
|
|
|
|
|
var ni = 0;
|
|
|
|
|
for (var i = 0; i < format.int.length; i++) {
|
|
|
|
|
var item = format.int[i];
|
|
|
|
|
if(item=="#" && ni < numinfo.int.length){
|
|
|
|
|
res.int.push(numinfo.int[ni]);
|
|
|
|
|
ni++;
|
|
|
|
|
}else if(item=="0"){
|
|
|
|
|
if(ni < numinfo.int.length){
|
|
|
|
|
res.int.push(numinfo.int[ni]);
|
|
|
|
|
ni++;
|
|
|
|
|
}else{
|
|
|
|
|
res.int.push(item);
|
|
|
|
|
}
|
|
|
|
|
}else if(item==","){
|
|
|
|
|
if(ni < numinfo.int.length){
|
2026-01-30 17:39:21 +08:00
|
|
|
if(ni==numinfo.int.length-1 && numinfo.int[ni]=="-"){
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2026-01-29 18:39:46 +08:00
|
|
|
res.int.push(",");
|
|
|
|
|
}else{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}else if(item!="#"){
|
|
|
|
|
res.int.push(item);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(format.scale!=undefined){
|
|
|
|
|
res.scale = [];
|
|
|
|
|
for (var j = 0; j < format.scale.length; j++) {
|
|
|
|
|
var item = format.scale[j];
|
|
|
|
|
if((item=="0" || item=="#") && numinfo.scale!=undefined && j < numinfo.scale.length){
|
|
|
|
|
res.scale.push(numinfo.scale[j]);
|
|
|
|
|
}else if(item!="#"){
|
|
|
|
|
res.scale.push(item);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var numL = 0;
|
|
|
|
|
for (var k = 0; k < res.scale.length; k++) {
|
|
|
|
|
var item = res.scale[k];
|
|
|
|
|
if(/\b/.test(item)){
|
|
|
|
|
numL++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(numinfo.scale!=undefined && numinfo.scale.length > numL){
|
|
|
|
|
var nz = res.scale[numL-1];
|
|
|
|
|
res.scale[numL-1] = parseInt(numinfo.scale[numL])>=5?parseInt(nz)+1:nz;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var reStr = "";
|
|
|
|
|
reStr += res.int.reverse().join("");
|
|
|
|
|
if(res.scale!=undefined){
|
|
|
|
|
reStr+= ".";
|
|
|
|
|
reStr+= res.scale.join("");
|
|
|
|
|
}
|
2026-01-30 17:39:21 +08:00
|
|
|
//return reStr.replace("-,", "-");
|
|
|
|
|
return sign+reStr;
|
2026-01-29 18:39:46 +08:00
|
|
|
}
|
|
|
|
|
|
2026-01-30 17:39:21 +08:00
|
|
|
// Number.prototype.format = function(fmt){
|
|
|
|
|
// if(fmt==undefined) throw new Error("参数格式化表达式不能为空!");
|
|
|
|
|
// return Number.format(this,fmt);
|
|
|
|
|
// }
|
2026-01-29 18:39:46 +08:00
|
|
|
|
|
|
|
|
Number.parse = function(str){
|
|
|
|
|
if(str==undefined) return str;
|
|
|
|
|
str += "";
|
|
|
|
|
if(/^-?\d+[\.\d]*$/.test(str)){
|
|
|
|
|
return new Number(str);
|
|
|
|
|
}
|
|
|
|
|
var sps = str.split("");
|
|
|
|
|
var res = [];
|
|
|
|
|
for (var i = 0; i < sps.length; i++) {
|
|
|
|
|
var item = sps[i];
|
|
|
|
|
if(item=="-" || item=="." || /[0-9]/.test(item)){
|
|
|
|
|
res.push(item);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return new Number(res.join(""));
|
|
|
|
|
}
|
|
|
|
|
})();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 扩展日期对象
|
|
|
|
|
*/
|
|
|
|
|
;(function(){
|
|
|
|
|
Date.SECOND = {
|
|
|
|
|
MINUTES:60000,
|
|
|
|
|
HOURS:3600000,
|
|
|
|
|
DAY:86400000,
|
|
|
|
|
WEEK:604800000,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Date.Dictionary = {
|
|
|
|
|
Holiday:{
|
|
|
|
|
"0101":"元旦",
|
|
|
|
|
"0214":"情人节",
|
|
|
|
|
"0308":"妇女节",
|
|
|
|
|
"0312":"植树节",
|
|
|
|
|
"0315":"消费者权益日",
|
|
|
|
|
"0401":"愚人节",
|
|
|
|
|
"0501":"劳动节",
|
|
|
|
|
"0504":"青年节",
|
|
|
|
|
"0512":"护士节",
|
|
|
|
|
"0601":"儿童节",
|
|
|
|
|
"0701":"建党节",
|
|
|
|
|
"0801":"建军节",
|
|
|
|
|
"0910":"教师节",
|
|
|
|
|
"0928":"孔子诞辰",
|
|
|
|
|
"1001":"国庆节",
|
|
|
|
|
"1006":"老人节",
|
|
|
|
|
"1024":"联合国日",
|
|
|
|
|
"1224":"平安夜",
|
|
|
|
|
"1225":"圣诞节",
|
|
|
|
|
},
|
|
|
|
|
LunarHoliday:{
|
|
|
|
|
"0101":"春节",
|
|
|
|
|
"0115":"元宵节",
|
|
|
|
|
"0505":"端午节",
|
|
|
|
|
"0707":"七夕情人节",
|
|
|
|
|
"0715":"中元节",
|
|
|
|
|
"0815":"中秋节",
|
|
|
|
|
"0909":"重阳节",
|
|
|
|
|
"1208":"腊八节",
|
|
|
|
|
"1224":"小年"
|
|
|
|
|
},
|
|
|
|
|
Week:{
|
|
|
|
|
"0" : "日",
|
|
|
|
|
"1" : "一",
|
|
|
|
|
"2" : "二",
|
|
|
|
|
"3" : "三",
|
|
|
|
|
"4" : "四",
|
|
|
|
|
"5" : "五",
|
|
|
|
|
"6" : "六"
|
|
|
|
|
},
|
|
|
|
|
timeDistance:{
|
|
|
|
|
yesterday:"昨天",
|
|
|
|
|
daysAgo:"{0}天前",
|
|
|
|
|
hoursAgo:"{0}小时前",
|
|
|
|
|
minutesAgo:"{0}分钟前",
|
|
|
|
|
justNow:"刚刚"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Date.is = function(obj){
|
|
|
|
|
return Object.prototype.toString.call(obj) == "[object Date]";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Date.valueOf = function(val,fmt){
|
|
|
|
|
if(val == undefined) return;
|
|
|
|
|
if(Date.is(val)){
|
|
|
|
|
return val;
|
|
|
|
|
}
|
|
|
|
|
if(String.is(val)){
|
|
|
|
|
if (/^\d+$/.test(val)) {
|
|
|
|
|
return new Date(parseInt(val));
|
|
|
|
|
}else if(fmt!=undefined){
|
|
|
|
|
var fmts = fmt.split("");
|
|
|
|
|
var conf = {
|
|
|
|
|
y:{start:undefined,end:undefined},
|
|
|
|
|
M:{start:undefined,end:undefined},
|
|
|
|
|
d:{start:undefined,end:undefined},
|
|
|
|
|
H:{start:undefined,end:undefined},
|
|
|
|
|
h:{start:undefined,end:undefined},
|
|
|
|
|
m:{start:undefined,end:undefined},
|
|
|
|
|
s:{start:undefined,end:undefined},
|
|
|
|
|
};
|
|
|
|
|
for (var i = 0; i < fmts.length; i++) {
|
|
|
|
|
var item = conf[fmts[i]];
|
|
|
|
|
if(item!=undefined){
|
|
|
|
|
if(item.start==undefined){
|
|
|
|
|
item.start = i;
|
|
|
|
|
}else{
|
|
|
|
|
item.end = i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var keys = Object.keys(conf);
|
|
|
|
|
var parse = {};
|
|
|
|
|
for (var j = 0; j < keys.length; j++) {
|
|
|
|
|
var key = keys[j];
|
|
|
|
|
if(conf[key].start!=undefined && conf[key].end!=undefined){
|
|
|
|
|
parse[key] = parseInt(val.substr(conf[key].start,conf[key].end+1));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return new Date(parse.y||1975,(parse.M||1)-1,parse.d||1,parse.H||parse.h||0,parse.m||0,parse.s||0);
|
|
|
|
|
}else{
|
|
|
|
|
return new Date(val.replace(/-/g, "/"));
|
|
|
|
|
}
|
|
|
|
|
}else if(Number.is(val)){
|
|
|
|
|
return new Date(val);
|
|
|
|
|
}
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Date.prototype.format = function(fmt){
|
|
|
|
|
fmt = fmt || "yyyy-MM-dd HH:mm:ss";
|
|
|
|
|
var o = {
|
|
|
|
|
"M+" : this.getMonth()+1, //月份
|
|
|
|
|
"d+" : this.getDate(), //日
|
|
|
|
|
"h+" : this.getHours()%12 == 0 ? 12 : this.getHours()%12, //小时
|
|
|
|
|
"H+" : this.getHours(), //小时
|
|
|
|
|
"m+" : this.getMinutes(), //分
|
|
|
|
|
"s+" : this.getSeconds(), //秒
|
|
|
|
|
"q+" : Math.floor((this.getMonth()+3)/3), //季度
|
|
|
|
|
"S" : this.getMilliseconds() //毫秒
|
|
|
|
|
};
|
|
|
|
|
if(/(y+)/.test(fmt)){
|
|
|
|
|
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
|
2026-01-30 17:39:21 +08:00
|
|
|
}
|
2026-01-29 18:39:46 +08:00
|
|
|
for(var k in o){
|
|
|
|
|
if(new RegExp("("+ k +")").test(fmt)){
|
|
|
|
|
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return fmt;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Date.prototype.toString = function(){
|
|
|
|
|
return this.format();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Date.prototype.getMonthInfo = function(){
|
|
|
|
|
return {
|
|
|
|
|
first:new Date(this.getFullYear(),this.getMonth(),1),
|
|
|
|
|
last:new Date(this.getFullYear(),this.getMonth()+1,0),
|
|
|
|
|
month:this.getMonth(),
|
|
|
|
|
name:this.format("yyyy-MM"),
|
|
|
|
|
monthIndex:this.getMonthIndex()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Date.prototype.getMonthIndex = function(){
|
|
|
|
|
return parseInt(this.format("yyyyMM"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Date.prototype.getYearInfo = function(){
|
|
|
|
|
return {
|
|
|
|
|
first:new Date(this.getFullYear(),0,1),
|
|
|
|
|
last:new Date(this.getFullYear(),12,0),
|
|
|
|
|
name:this.format("yyyy")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Date.prototype.getWeekOpt = function(){
|
|
|
|
|
var yearFirst = new Date(this.getFullYear(),0,1);
|
|
|
|
|
var d = Math.round((this.valueOf() - yearFirst.valueOf()) / Date.SECOND.DAY);
|
|
|
|
|
return {
|
|
|
|
|
first:new Date(this.getTime() - this.getDay()* Date.SECOND.DAY),
|
|
|
|
|
last:new Date(this.getTime() + (7 - this.getDay())* Date.SECOND.DAY),
|
|
|
|
|
monthIndex:Math.ceil((this.getDate() + 6 - this.getDay()) / 7),
|
|
|
|
|
yearIndex:Math.ceil((d + ((yearFirst.getDay() + 1) - 1)) / 7),
|
|
|
|
|
name:this.format("EE"),
|
|
|
|
|
fullName:this.format("yyyy-MM EE")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Date.prototype.copy = function(){
|
|
|
|
|
return new Date(this.getFullYear(),this.getMonth(),this.getDate(),this.getHours(),this.getMinutes(),this.getSeconds());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Date.prototype.getDayIndex = function(){
|
|
|
|
|
var yearFirst = new Date(this.getFullYear(),0,1);
|
|
|
|
|
return parseInt((this.valueOf() - yearFirst.valueOf())/Date.SECOND.DAY)+1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Date.prototype.getDayName = function(){
|
|
|
|
|
return this.format("yyyy-MM-dd");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Date.prototype.next = function(){
|
|
|
|
|
if(arguments.length==0){
|
|
|
|
|
return new Date(this.getTime()+Date.SECOND.DAY);
|
|
|
|
|
}
|
|
|
|
|
if(arguments.length > 0){
|
|
|
|
|
var type = arguments[0];
|
|
|
|
|
if(Object.prototype.toString.call(type) == "[object Number]" ||
|
|
|
|
|
(Object.prototype.toString.call(type) == "[object String]" && /^-?\d+$/.test(type))){
|
|
|
|
|
return new Date(this.getTime()+Date.SECOND.DAY*parseInt(type));
|
|
|
|
|
}
|
|
|
|
|
var step = parseInt(arguments[1]) || 1;
|
|
|
|
|
var res = undefined;
|
|
|
|
|
switch (type) {
|
|
|
|
|
case "y":
|
|
|
|
|
res = new Date(this.getTime());
|
|
|
|
|
res.setFullYear(this.getFullYear()+step);
|
|
|
|
|
break;
|
|
|
|
|
case "M":
|
|
|
|
|
res = new Date(this.getTime());
|
|
|
|
|
res.setDate(1);
|
|
|
|
|
var y = step%12;
|
|
|
|
|
res.setFullYear(this.getFullYear()+parseInt(step/12));
|
|
|
|
|
var month = res.getMonth()+y;
|
|
|
|
|
if(month>11){
|
|
|
|
|
res.setFullYear(res.getFullYear()+1);
|
|
|
|
|
res.setMonth(month-12);
|
|
|
|
|
}else if(month < 0){
|
|
|
|
|
res.setFullYear(res.getFullYear()-1);
|
|
|
|
|
res.setMonth(month+12);
|
|
|
|
|
}else{
|
|
|
|
|
res.setMonth(month);
|
|
|
|
|
}
|
|
|
|
|
var conf = res.getMonthInfo();
|
|
|
|
|
if(this.getDate() < conf.last.getDate()){
|
|
|
|
|
res.setDate(this.getDate());
|
|
|
|
|
}else{
|
|
|
|
|
res.setDate(conf.last.getDate());
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case "w": res = new Date(this.getTime()+Date.SECOND.WEEK*step); break;
|
|
|
|
|
case "d": res = new Date(this.getTime()+Date.SECOND.DAY*step); break;
|
|
|
|
|
case "H": res = new Date(this.getTime()+Date.SECOND.HOURS*step); break;
|
|
|
|
|
case "m": res = new Date(this.getTime()+Date.SECOND.MINUTES*step); break;
|
|
|
|
|
case "s": res = new Date(this.getTime()+1000*step); break;
|
|
|
|
|
default:
|
|
|
|
|
res = new Date(this.getTime()+Date.SECOND.DAY*step);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
})();
|