9

我从 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”。这显然是问题所在。有没有办法可以将我的值转换为这些浏览器的日期对象?

4

5 回答 5

27

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 的回答。

于 2012-06-28T21:50:37.080 回答
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 对象,则假定它是客户端的本地时间。

于 2012-06-28T21:48:05.847 回答
2

结合千斤顶和乔拉森的回应,以下代码对我来说效果很好:

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

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

于 2014-12-23T08:04:16.757 回答
1

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

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

于 2012-06-28T21:50:31.007 回答
1

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

于 2014-02-24T22:10:57.373 回答