Saturday, February 7, 2009

date js

关于日期时间操作的 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: