datepicker获取选中日期并格式化输出,在IE中输出NaN,在火狐和谷歌浏览器中正常

原创文章 作者:月光光 2010年11月26日 16:03helloweba.com 标签:JavaScript 

今天在工作中遇到这样一个问题:使用jquery ui的datepicker日历控件,获取选中的日期,并且要将日期转换成日期对象格式,如:Tue Nov 30 00:00:00 UTC+0800 2010,以便与其他代码对接。

我的代码如下:

$("#mydate").datepicker({
		showOn: "button",
		buttonImage: "images/calendar.gif",
		buttonImageOnly: true,
		buttonText:"日历",
		onSelect:function(dateText,inst){
				alert(dateText);
                r = new Date(dateText);
                alert(r);
                ...do something...
        }
}

我要实现的效果是:当点击日历控件,选中日期时,获取当前日期,并转换日期格式赋值给变量r,用于后面更复杂的工作。

我们知道,jaascript用来创建一个日期对象,返回当前的日期和时间,直接使用new Date,如:

var date = new Date();
alert(date);

输出的是当前日期和时间,格式为:Tue Nov 30 00:00:00 UTC+0800 2010。直接可以使用在项目中,而且在IE和火狐上都正常。

可是,如果是new Date()接收外部传来的参数如我使用datepicker中用到new Date(dateText)。这个时候用火狐和谷歌浏览器测试,能正常输出日期格式为:Tue Nov 30 00:00:00 UTC+0800 2010。但是在IE7上就杯具了,IE7输出的结果为:NaN。

郁闷了一阵子,试过很多方法,最后不得不放弃new Date()这个原始的方法,从http://jibbering.com/faq/#parseDate找到了一个转换函数,代码如下:

//转换日期格式
function parseISO8601(dateStringInRange) {
    var isoExp = /^s*(d{4})-(dd)-(dd)s*$/,
        date = new Date(NaN), month,
        parts = isoExp.exec(dateStringInRange);

    if(parts) {
      month = +parts[2];
      date.setFullYear(parts[1], month - 1, parts[3]);
      if(month != date.getMonth() + 1) {
        date.setTime(NaN);
      }
    }
    return date;
}

不难看出,代码能将格式为“2010-11-26”的日期转换为:“Fri Nov 26 00:00:00 UTC+0800 2010 ”的格式。于是,在我的代码中直接调用这个函数处理下就OK。最终代码:

$("#mydate").datepicker({
		showOn: "button",
		buttonImage: "images/calendar.gif",
		buttonImageOnly: true,
		buttonText:"日历",
		onSelect:function(dateText,inst){
				alert(dateText);
                var r = parseISO8601(dateText); //转换格式
                alert(r);
                ...do something...
        }
}
声明:本文为原创文章,helloweba.net和作者拥有版权,如需转载,请注明来源于helloweba.net并保留原文链接:https://www.helloweba.net/javascript/84.html

2条评论

  • 不用那么麻烦,ie6/78不支持 参数为2014-1-16这样的格式,支持2014,1,16这样的格式,只用将输入的时间格式化一下就可以了

  • 不用那么麻烦,ie6/78不支持 参数为2014-1-16这样的格式,支持2014,1,16这样的格式,只用将输入的时间格式化一下就可以了