所以我在这里遇到了一个非常奇怪的问题,目前没有想法。
我有以下函数来按属性 RowDate
解析和排序 json 对象,
包含以下格式的日期字符串:"/Date(1389682861507+0100)/"
。
orderByDate: function (json) {
debug('[DataCollection::orderByDate], json before ordering: ', json);
_.each(json.LineDefinitions, function (line, i) {
json.LineDefinitions[i].Artifacts.sort(function (a, b) { //Artifacts is an Array of json subobjects containing "RowDate"
return MyApp.Utils.formatDate(a.RowDate) - MyApp.Utils.formatDate(b.RowDate);
});
});
debug('[DataCollect::orderByDate], json after ordering: ', json);
return json;
},
这里每个 RowDate
都包含一个与上面给出的字符串类似的字符串(尽管日期不同)。
formatDate
函数如下所示:
MyApp.Utils.formatDate = function (date) {
var ret;
if (date instanceof Date) {
ret = '/Date(' + date.getTime()
+ (date.getTimezoneOffset() <= 0 ? '+' : '-')
+ String(('0000' + ((date.getTimezoneOffset() / 60) * -100)).substr(-4)) + ')/';
} else {
ret = new Date(Number(String(date).replace(/(^.*\()|([+-].*$)/g, '')));
}
return ret;
};
对于我的问题案例,程序流使用 else
条件。
现在它在 IE10 和 11(原文如此!)以及 Firefox 38.0.5 中运行良好,结果顺序恰到好处。但在 chrome 最新稳定版(你没听错)v43 中,我的 console.log 中的顺序错误,导致我的应用程序稍后出现意外行为。
所以我在这里找到了这个线程:Different values with Date() in Chrome and IE (这里是德国,本地时间可能会有所不同,所以我认为这可能是原因?!)
并尝试使用 momentjs 将 formatDate-else-line 更改为以下内容(后来来到这个项目。我更改的第一件事是在各处使用 momentjs...):
ret = moment.utc(date).toDate();
=> 没有效果,所以我也从 momentjs-docs 尝试了这个:
ret = moment(date, moment.ISO_8601).toDate();
但这似乎也不起作用。目前我没有想法,我希望这里的人能帮助我解决我的问题:如何更改 chromes 日期解析以匹配 ff/ie 解析?还是我脑子里有一个真正的大结并且这里出了其他问题?
很高兴收到您的来信!
编辑 为了让事情更清楚,我在这里创建了这个 fiddle : http://jsfiddle.net/o3zh2kv4/8/
在 IE 和 Firefox 中,输出为:
测试1、测试8、测试2、测试9、测试3、测试10、测试4、测试11、测试5、测试12、测试6、测试13、测试7、测试14、
这是我想要的进一步逻辑输出。但在 Chrome 中,我得到以下信息:
测试8、测试1、测试9、测试2、测试10、测试3、测试4、测试11、测试5、测试12、测试6、测试13、测试7、测试14、
我不知道为什么会这样。很高兴在这里得到一些帮助!我也需要 chrome 来更改顺序。
最佳答案
您面临的问题很可能是由于不同的浏览器(引擎)实现不同的排序算法而引起的。
您体验到的差异(乍一看)都集中在没有差异的元素上(例如,从排序函数返回 0),因此没有描述确定性的排序行为。
要解决此问题,您需要实现自定义排序算法,或引入更多排序标准。
关于javascript - 如何更改 chromes 日期解析/排序以匹配 ff/ie 日期解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30860328/