关于日期时间操作的 js 函数库 date-js 。简单实用。
/**
date
set()
clone()
fmt()
Y() ~ FullYear
m() ~ Month
d() ~ Date
H() ~ Hours
M() ~ Minutes
S() ~ Seconds
s() ~ Milliseconds
t() ~ Time
[static] from()
使用示例
var d = date(),
D = new Date();
D.getMonth() == d.m()
D.getFullYear() == d.Y()
D.setFullYear(1999) == d.Y(1999)
D.setHours(8) == d.H(8)
d.set('m+1') == D.setMonth(D.getMonth() + 1)
d.set('Y2008m0') == (D.setFullYear(2008) && D.setMonth(0))
d.fmt('%Y-%m-%d %H:%M:%S.%s %%s') == '2009-02-04 22:23:45 %s'
set()
如果带 +/- 操作,那么表示将相应的项添加或者减少(W 表示增减周.7天.)。
如果不带 +/- 操作,那么:
Y 的设置将自动取当前年的前 n 位补齐 Y 不够 4 位的部分,例如 Y34 会被认为是设置 2034 年,Y123 会被认为是设置 2123 年(假设当前时间为 2009年)。
M 的操作会按照月份的数字设定,比如 M1 将设置月份为 1月,M12 设置月份为 12月,M0 则设置为上一年的最后一月(年份会自动减小)。
W 的操作会设置周几,比如,假设当前为周三,那么 W1 会将日期前移 2 天(到周一),W0 会将日期前移 3 天,到上周日,W7 会将日期后移到本周日,如果设置大于 7 也可以,不过应该比较难理解了。
其他按照字面意思进行。
示例:
Q: 这个月有多少天?
A: d.set('M+1D0').D()
Q: 上个月有多少天?
A: d.set('D0').D()
Q: 5 月有多少天?
A: d.set('M6D0').D()
Q: 这周的第一天是哪天,最后一天呢(假设第一天是周一)?
A: d.set('W1'), d.set('W7')
Q: 如果要显示这个月的日历,那么第一天和最后一天是什么(假设第一天是周一)?
A: d.set('D1W1'), d.set('M+1D0W7')
Q: 上一个问题中,如果所有日历都显示 6 周,那么最后一天如何计算?
A: d.set('D1W1'), d.set('D1W7W+5')
*/
var date = (function(){
function now(){return new date()}
function iter(obj, fn, o){
o = o || obj;
if(!(obj && typeof obj == 'object')){
return;
}
var i,
l = obj.length;
if(typeof l == 'number'){
if(l){
for(i=0;i<l;i++){
if(fn.call(o, obj[i], i, obj) === false){
break;
}
}
}
}else{
for(i in obj){
if(obj.hasOwnProperty(i)){
if(fn.call(o, obj[i], i, obj) === false){
break;
}
}
}
}
return iter;
}
function mixin(target, source){
for (var x in source) {
target[x] = source[x];
}
return mixin;
}
function date(Y, m, d, H, M, S, s){
var r = this;
if(this instanceof date){
this._d = new Date;
}else{
r = new date;
}
if(arguments.length){
r.t(new Date(Y, m, d, H, M, S, s).getTime());
}
return r;
}
mixin(date,
{
conv:{
'Wm':10080,
'dm':1440,
'WS':604800,
'dS':86400,
'Ws':604800000,
'ds':86400000,
'Hs':3600000,
'Ms':60000,
'Ss':1000,
'ss':1
},
from:function(s){
return new date().set(s);
}
}
);
iter(
{
Y: 'FullYear',
m: 'Month',
d: 'Date',
H: 'Hours',
M: 'Minutes',
S: 'Seconds',
s: 'Milliseconds',
t: 'Time'
},
function(v, k){
date.prototype[k] =
(function(s,g){
return function(v) {
v!==undefined && v!==null && this._d[s](v);
return this._d[g]();
}
})('set' + v, 'get' + v);
}
);
mixin(date.prototype,
{
set: function(str){
var d= this;
str.replace(
/[YmdWHMSs][+-]?\d+/g,
function(w){
w= w.match(/(\w)([+-]?)(\d+)/);
var f=w[1], //key
v= w[3], //value
s= w[2]; //type(+/-)
if(s==''){
if(f=='Y' && v.length < 4){
v= '' + String(now().Y()).slice(0,4-v.length) + v
}
if(f=='m'){
v= parseInt(v)-1;
d.m(v);
}else if(f=='W'){
v= parseInt(v)-d.getDay();
if(v){
d.set('d' + (v>0?'+':'') + v);
}
}else{
d[f](parseInt(v))
}
}else{
v= parseInt(s+v, 10);
if(v){
switch(f){
case 'Y':
case 'm':
d[f](d[f]()+v);
break;
default:// dWHMSs
d.t(d.t() + v * date.conv[f+'s']);
break;
}
}
}
return ''
}
);
return this
},
fmt: function(str){
if(!str){
str = 'YY-mm-dd HH:MM:SS';
}
var d= this;
return str.replace(
/%([YmdHMS%])/g,
function(w, s){
return s == '%' ?
s :
(('' + d[s]()).replace(/^(\d)$/, '0$1'));
}
);
},
clone:function(s){
return new date(this.t()).set(s);
},
toString: function(){
return this._d.toString.apply(this._d, arguments);
},
valueOf: function(){
return this._d.valueOf.apply(this._d, arguments);
}
}
);
//date.prototype.str = date.prototype.format = date.prototype.strfmt = date.prototype.fmt;
return {
iter: iter,
mixin: mixin,
date: date,
now: now
};
})().date;
No comments:
Post a Comment