我的日期值如下所示,
"/Date(1366009200000)/";
我必须根据上述日期格式值对行进行排序并显示结果。
我应用了一个逻辑来转换这个日期格式,然后按降序排序。它在IE中完美运行,但在Chrome中无法运行。
以下是代码:
var rows = [];
var row1 = {};
row1.HIREDT = "/Date(1366009200000)/";
rows.push(row1);
var row2 = {};
row2.HIREDT = "/Date(1362985200000)/";
rows.push(row2);
var latestRow = $.grep(rows, function (row) {
return Math.max(new Date(row.HIREDT));
}).sort(function (x, y) {
return y.HIREDT.localeCompare(x.HIREDT) //desc
});
$('#result').text('Total rows in result: '+latestRow.length)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<label id="result"></label>
问题:
new Date(row.HIREDT)
正在使用IE,但不适用于Chrome。我错过了什么吗?
答案 0 :(得分:5)
您是否阅读过Date
's documentation?
dateString 表示日期的字符串值。该字符串应采用
Date.parse()
方法识别的格式(符合IETF的RFC 2822时间戳和ISO8601的版本)。
您没有RFC 2822或ISO8601字符串,因此您应该期望它失败。它恰好在IE中工作,因为
ECMAScript规范指出:如果String不符合标准格式,则该函数可以回退到任何特定于实现的启发式或特定于实现的解析算法。 ISO格式字符串中包含非法元素值的无法识别的字符串或日期将导致
Date.parse()
返回NaN
。
......换句话说,你很幸运。
如果您知道所收到的字符串格式始终相同,则只需提取数字子字符串即可。由于它已经是一个数字(从纪元开始),你可以parseInt
直接对时间戳进行排序;无需涉及Date
。
答案 1 :(得分:2)
使用子字符串删除/Date(...)/
,并在传递给Date的构造函数之前将其解析为int:
new Date(parseInt(row.HIREDT.substring(6, row.HIREDT.length - 2)))
似乎是IE does support additional forms of String on Date creation such as a VT_DATE value from an ActiveX Object。但这并不意味着所有浏览器都会支持它。
由于我们经常需要跨浏览器支持,因此我们需要一种适用于所有浏览器的解决方案。构建日期的最常见/标准方法是使用自1970年1月1日以来的时间(以毫秒为单位),我们可以在Mozilla's documentation中看到。
答案 2 :(得分:1)
基于以上建议,这是我实施的逻辑,它可以在IE和Chrome中运行......
var latestRow = $.grep(rows, function (row) {
var dateString = row.HIREDT.substr(6);
var rawDate = new Date(parseInt(dateString));
return Math.max(rawDate);
}).sort(function (x, y) {
return y.HIREDT.localeCompare(x.HIREDT) //desc
});