Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Safari和IE中的javascript日期对象问题_Javascript_Internet Explorer_Date_Safari - Fatal编程技术网

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

Safari和IE中的javascript日期对象问题,javascript,internet-explorer,date,safari,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

我以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


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

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

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

较旧的Internet Explorer版本(以及您的Safari版本)不会解析yyyy-mm-dd字符串,例如
新日期('2012-12-31')

另一个选项是,尽管这可能有点过分。

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]);
请注意,month参数从零开始(对于一月),因此必须从字符串中获得的值中减去1

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

如果使用PHP web服务,我建议使用
$row['date']=date('j/n/Y',strottime($row['date'])
为了使safari/ie具有正常的功能。

结合jacks和joe larson的反应,以下代码对我很有效:

        $scope.formatDate = function(date){
                var date = date.split("-").join("/");
                var dateOut = new Date(date);
                return dateOut;
        }; 
适用于Chrome和Safari…:)

谢谢杰克和乔·拉森

简单而甜蜜的解决方案:)
var your_date=newdate(dateString.split(“-”).join(“/”)如果您也需要时间:必须指出month参数是零索引的。我得到了一些疯狂的结果,直到我意识到我忘了从中减去1。我看到了注释,但也许您应该明确解释一下
date[1]-1
是实现细节的结果。