【问题标题】:javascript date object issue in Safari and IESafari 和 IE 中的 javascript 日期对象问题
【发布时间】:2012-06-30 11:41:38
【问题描述】:

我从 2012-12-31 格式的 JSON 对象中获取日期,并尝试将其转换为友好值并输出。

    var redeemableDate = item.Deal.RedeemableDate; //this is coming in the form of 2012-12-31
    var redeemableDate = new Date(redeemableDate);
    var rdDay = weekday[redeemableDate.getDay()]; //using an array with weekdays
    var rdDate = redeemableDate.getDate();
    var rdMonth = monthNames[redeemableDate.getMonth()]; //using an array with month names
    var rdYear = redeemableDate.getFullYear();

    response.write('Valid ' + rdDay + ' ' + rdDate + ' ' + rdMonth + ' ' + rdYear + ' ONLY');

这一切在 Firefox 和 Chrome 中都能正常工作,但 Safari 和 IE(目前仅在 IE8 上测试过)不喜欢它。

在 FF 和 Chrome 中,我得到了预期:

仅在 2012 年 9 月 2 日星期日有效

但在 Safari 和 IE 中,我得到:

有效的 undefined NaN undefined NaN ONLY

当我将可赎回日期设置为日期对象后发出警报时,Safari 会返回“无效日期”,而 IE 会返回“NaN”。这显然是问题所在。有没有办法可以将我的值放入这些浏览器的日期对象中?

【问题讨论】:

    标签: javascript internet-explorer date safari


    【解决方案1】:

    Safari 和 IE 不支持 yyyy-mm-dd (ISO 8601) 日期格式。虽然它是 ECMAscript 5 的一部分,所以应该只是时间问题。

    解决方案是将日期作为参数传递给 Date。

    var date = "2012-12-31".split("-");
    var your_date = new Date(date[0], date[1]-1, date[2]);
    

    请注意,月份参数从零开始(对于一月),因此您必须从从字符串中获得的值中减去 1。

    编辑: 有关快捷方式,请参阅下面 joe larson 的回答。

    【讨论】:

    • 简单而甜蜜的解决方案:)
    • var your_date=new Date(dateString.split("-").join("/"));
    • 如果你也需要时间:stackoverflow.com/questions/6427204/…
    • 重要的是要指出月份参数是零索引的。我得到了一些疯狂的结果,直到我意识到我忘了从中减去 1。我看到了注释,但也许您应该明确说明 date[1]-1 是该实现细节的结果。
    【解决方案2】:

    你最好自己解析日期字符串:

    function dateFromISO( str ) {
      var d = null;
      str.replace(/^(\d\d\d\d)-(\d\d)-(\d\d)$/, function(_, y, m, d) {
        d = new Date(parseInt(y, 10), parseInt(m, 10) - 1, parseInt(d, 10));
      });
      return d;
    }
    
    redeemableDate = dateFromISO( redeemableDate );
    

    即使其他浏览器喜欢这些日期字符串,您也会遇到问题,即它们总是被解释为 UTC。例如,对我来说,当我将该字符串“2012-12-31”传递给 Firefox 时,它告诉我日期是 2012 年 12 月 30 日,因为我比 UTC 晚了 6 个小时。换句话说,“2012-12-31”被解释为该日期的午夜,UTC 时间。假设您希望世界上的每个人都能看到正确的日期,如果您使用数字构造 Date 对象,则假定它是客户端的本地时间。

    【讨论】:

      【解决方案3】:

      结合 jacks 和 joe larson 的响应,以下代码对我来说效果很好:

              $scope.formatDate = function(date){
                      var date = date.split("-").join("/");
                      var dateOut = new Date(date);
                      return dateOut;
              }; 
      

      适用于 Chrome 和 Safari...:)
      谢谢杰克和乔拉森!!!

      【讨论】:

        【解决方案4】:

        较旧的 Internet Explorer 版本(显然是您的 Safari 版本)不会解析 yyyy-mm-dd 字符串,例如 new Date('2012-12-31')

        另一个选项是jQuery.datepicker.parseDate(),尽管这可能有点过头了。

        【讨论】:

          【解决方案5】:

          如果使用 PHP Web 服务,我建议使用返回日期 $row['date'] = date('j/n/Y',strtotime($row['date'])); 具有正常的 safari/ie 功能。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-03-05
            • 1970-01-01
            • 1970-01-01
            • 2013-10-07
            • 2018-10-10
            • 2014-02-10
            • 2013-09-07
            • 1970-01-01
            相关资源
            最近更新 更多