Fra*_*ser 9 javascript safari internet-explorer date
我将以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');
Run Code Online (Sandbox Code Playgroud)
这一切都适用于Firefox和Chrome,但Safari和IE(目前仅在IE8上测试过)并不喜欢它.
在FF和Chrome中,我得到了预期的结果:
仅限2012年9月2日星期日
但在Safari和IE中,我得到:
有效的未定义NaN未定义NaN ONLY
在我将其设置为Date对象后提醒redeemableDate时,Safari返回'Invalid Date'并且IE返回'NaN'.这显然是问题所在.有没有办法让我的价值变成这些浏览器的日期对象?
jac*_*ack 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]);
Run Code Online (Sandbox Code Playgroud)
请注意,month参数从零开始(对于1月),因此必须从字符串中获取的值中减去1.
编辑:有关快捷方式,请参阅下面的joe larson的回答.
你最好自己解析日期字符串:
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 );
Run Code Online (Sandbox Code Playgroud)
即使其他浏览器喜欢这些日期字符串,您也会遇到始终被解释为UTC的问题.对我来说,例如,当我将该字符串"2012-12-31"传递给Firefox时,它告诉我该日期是2012年12月30日,因为我比UTC低6小时.换句话说,"2012-12-31"被解释为该日期的午夜,UTC时间.假设您希望世界上的每个人都能看到正确的日期,如果您使用数字构造Date对象,则假定它是客户端的本地时间.
| 归档时间: |
|
| 查看次数: |
18284 次 |
| 最近记录: |