日期类恐怕是我见过最无奈的JavaScript内置类(对象)。因为他的浏览器不同表现,时间日期的操作处理都显得那么的不友好。幸好,JavaScript固有的机制可以让我们自己来解决这些问题。不过在此之前我们还是先大致了解下他的一些方法和属性。

创建一个日期对象可以有这些方法

方法一:var d = new Date(ms);//ms代表从1970.1.1凌晨0点的毫秒数

方法二:var d = new Date(year,month[,day,hour,minute,second,millisecond]);

方法三:var d = new Date("localDateString");//这里不是那么的通用。2011/5/5格式相对通用

如果我们需要创建一个当前时间的日期对象。直接new Date()用无参数的构造函数即可。当然我们不能忽略这个new,前面提到String和Array可以省略,然而这里千万不能这样做。因为Date()的结果是浏览器实现的一个日期对象的toString返回的表示日期的字符串。故此,这里两者不能混用。

日期对象的方法大致分为获取和设置日期时间的某一(几)个部分。获取方法相对好用一些,然后设置方法则显得不那么够用。这里有几个需要拿出来先说说。

getDate/setDate。该方法操作的是天数,而非日期值。这个还是有点不大直观的。

getDay/setDay。该方法操作的是周数,序数从0开始,即周日的值是0。

getMonth/setMonth。该方法操作的是月数没有疑问,但是月数是从0开始。

getFullYear/setFullYear。我通常建议用这组方法来代替直观的getYear/setYear。

toDateString/toTimeString==输出日期的方法。但是并不是那么的好用。

接下来,让我们一步一步来打造更适合自己的一套方法。

首先,我们来格式化输出

var conf = {

syslang : "cn" //设置系统语言

};

Date.prototype.toFormatString = function(format) {

var weeks = {};

weeks['cn'] = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];

weeks['en'] = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];

var self = this;

var fix = {

'yyyy':self.getFullYear(),

'MM':self.getMonth()+1,

'dd':self.getDate(),

'wk':weeks[conf.syslang][self.getDay()],
'hh':self.getHours(),

'min':self.getMinutes(),

'ss':self.getSeconds()
};

return format.replace(/[a-zA-Z]+/g,function(m){

return fix[m];

});

};

嗯,这个方法多了个全局的配置对象,但是这个不是必须的,只是在这里提示大家如果实现个性化定制,但是如果是自己的项目使用,我更建议减少代码(把en或cn去掉)来打造适合自己项目的精简代码。该方法的使用一目了然,在这里也不多解释了。

接下来是日期的操作,第一组是日期的加减。熟悉.net的朋友都知道AddXXX的一组方法,因此我们也可以打造一组这样的代码,在此我只列举一个,有需要的可以自己实现其他的。其实这套方法可以使用伪泛型的方式将Add方法组并到一个方法。但是我更愿意用一目了然的方法名来提供。

Date.prototype.addMonth = function(n){

var month = this.getMonth();

this.setMonth(month+n);

};

怎么样,很简单吧。不用担心溢出(13月)或者负月份(-1月)会造成什么不良后果,日期对象会自己为了通过调整年数来得到合适的结果。

接下来是日期比较。纯粹的日期比较不是问题,因为getTime获取毫秒数之后进行加减操作即可。然而如果要是比较相差的天数怎么办呢。其实也简单。那就是相差的毫秒数换算到天数即可

Date.prototype.compareTime = function(time) {

var ticks = time.getTime() - this.getTime();

return Math.floor(ticks/(1000*60*60*24));

}

至于比较周数同理,但是月数和年数呢?对不起,考虑到闰年和大小月等问题,这个方法比较复杂,在这里就不贴出来了,如果您有兴趣不妨尝试着自己写写看。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cj205/archive/2011/01/23/6159709.aspx

JavaScript 最后修改于 2011-02-09 11:37:55
上一篇