Safari和IE中的javascript日期对象问题

时间:2012-06-28 21:44:40

标签: javascript internet-explorer date safari

我正在以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中,我得到了:

  

有效的未定义NaN未定义NaN ONLY

当我在设置为Date对象后提醒redeemableDate时,Safari返回'Invalid Date'并且IE返回'NaN'。这显然是问题所在。有没有办法让我的价值变成这些浏览器的日期对象?

5 个答案:

答案 0 :(得分:26)

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月份),因此您必须从字符串中获取的值中减去1。

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

答案 1 :(得分:6)

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

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对象,则假定它是客户端的本地时间。

答案 2 :(得分:2)

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

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

适用于Chrome和Safari ...... :) 谢谢Jack和joe larson !!!

答案 3 :(得分:1)

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

另一种选择是jQuery.datepicker.parseDate(),虽然这可能有点矫枉过正。

答案 4 :(得分:1)

在使用PHP Web服务的情况下,我建议您使用返回日期 $row['date'] = date('j/n/Y',strtotime($row['date']));具有safari / ie。

的正常功能