`
冷寒冰
  • 浏览: 243203 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

new Date(myDateString)在IE中输出NaN,在火狐和谷歌浏览器中正常

 
阅读更多
今天在工作中遇到这样一个问题:使用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);
                //dateText:"2014-04-23"
                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。
我们可以借鉴fullcalendar中的一个日期函数,而不要直接调用js中原生态的new Date(),
  function parseISO8601(s, ignoreTimezone) { // ignoreTimezone defaults to false
            // derived from http://delete.me.uk/2005/03/iso8601.html
            // TODO: for a know glitch/feature, read tests/issue_206_parseDate_dst.html
            var m = s.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2})(:?([0-9]{2}))?))?)?)?)?$/);
            if (!m) {
                return null;
            }
            var date = new Date(m[1], 0, 1);
            if (ignoreTimezone || !m[13]) {
                var check = new Date(m[1], 0, 1, 9, 0);
                if (m[3]) {
                    date.setMonth(m[3] - 1);
                    check.setMonth(m[3] - 1);
                }
                if (m[5]) {
                    date.setDate(m[5]);
                    check.setDate(m[5]);
                }
                fixDate(date, check);
                if (m[7]) {
                    date.setHours(m[7]);
                }
                if (m[8]) {
                    date.setMinutes(m[8]);
                }
                if (m[10]) {
                    date.setSeconds(m[10]);
                }
                if (m[12]) {
                    date.setMilliseconds(Number("0." + m[12]) * 1000);
                }
                fixDate(date, check);
            } else {
                date.setUTCFullYear(
            m[1],
            m[3] ? m[3] - 1 : 0,
            m[5] || 1
        );
                date.setUTCHours(
            m[7] || 0,
            m[8] || 0,
            m[10] || 0,
            m[12] ? Number("0." + m[12]) * 1000 : 0
        );
                if (m[14]) {
                    var offset = Number(m[16]) * 60 + (m[18] ? Number(m[18]) : 0);
                    offset *= m[15] == '-' ? 1 : -1;
                    date = new Date(+date + (offset * 60 * 1000));
                }
            }
            return date;
        }
        function fixDate(d, check) { // force d to be on check's YMD, for daylight savings purposes
            if (+d) { // prevent infinite looping on invalid dates
                while (d.getDate() != check.getDate()) {
                    d.setTime(+d + (d < check ? 1 : -1) * HOUR_MS);
                }
            }
        }

不难看出,代码能将格式为“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...
        }
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics