【问题标题】:How do I change chromes Date-parsing / Sorting to match ff/ie Dateparsing?如何更改 chrome 日期解析/排序以匹配 ff/ie 日期解析?
【发布时间】:2015-06-16 06:33:28
【问题描述】:

所以我在这里遇到了一个非常奇怪的问题,目前没有想法。

我有以下函数通过属性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();

但这似乎也不起作用。目前我没有想法,我希望你们这里的人可以帮助我解决我的问题:如何更改 chrome 日期解析以匹配 ff/ie 解析?还是我脑子里真的有一个大结,而这里出了什么问题?

很高兴收到您的来信!

编辑 为了让事情更清楚,我在这里创建了这个小提琴: http://jsfiddle.net/o3zh2kv4/8/

在 IE 和 firefox 中,输出为:

test1, test8, test2, test9, test3, test10, test4, test11, test5, test12, test6, test13, test7, test14,

这是我想要的进一步逻辑的输出。但在 chrome 中,我得到以下信息:

test8, test1, test9, test2, test10, test3, test4, test11, test5, test12, test6, test13, test7, test14,

我不知道为什么会这样。在这里得到一些帮助会很棒!我也需要 chrome 来更改顺序。

【问题讨论】:

  • 您能更详细地描述您面临的问题吗?你去掉了时区的日期字符串,所以这可能是个问题。
  • @Rouby 感谢您到目前为止所做的努力,目前我的尝试似乎还不够清楚。我添加了一个小提琴,我认为它更好地描述了我的问题。能得到进一步的帮助会很棒! :)
  • 我已经删除了我之前的答案(因为它不能解决您的问题)并添加了一个希望更有帮助的答案。

标签: javascript jquery google-chrome date momentjs


【解决方案1】:

您面临的问题很可能是由于不同的浏览器(引擎)实现了不同的排序算法。

您遇到的差异(乍一看)都集中在没有差异的元素上(例如,从您的排序函数返回 0),因此没有描述确定性的排序行为。

要解决此问题,您需要实现自定义排序算法,或引入更多排序标准。

【讨论】:

  • 感谢您的回答。可悲的是,此时我的代码中没有更多的排序标准,所以.... 耸耸肩 似乎我必须创建自己的排序算法...我会看看在 Mozilla 的排序实现中。 叹息
【解决方案2】:

具体来说,从 22.1.3.24 (https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.prototype.sort) 未指定,“此数组的元素已排序。排序不一定稳定(即比较相等的元素不一定保持其原始顺序)。如果 comparefn 不是未定义的,它应该是一个接受两个参数 x 和 y 的函数,如果 x y 返回正值。”

在当前 V8 的 HEAD 中(在我开始研究它之前可能已经有很长一段时间了),Array.prototype.sort() 总是使用不稳定的快速排序,这意味着不能保证相等的值仍然存在与排序前的顺序相同。

有趣的是,源代码中的注释表明我们曾经对小数组(

我建议您尝试一下,如果蜘蛛猴或脉轮中的元素数量较多,您是否会遇到不稳定的排序行为,如果需要,请务必实施您自己的稳定排序。

【讨论】:

  • 非常感谢@chronicsalsa。我刚刚在这里提出了一个问题:code.google.com/p/v8/issues/detail?id=4189#makechanges希望他们会出于网络兼容性的目的对其进行更改:) 应该标准化(作为所有内容)以使它们按我认为的顺序排列(我只是觉得奇怪地抱怨 Chrome 自己做事情,我总是抱怨旧的 IE 浏览器,但是 chrome ......?:D)
  • 听起来有人会支持将 A.p.stableSort() 添加到类似于 c++11 中的 std::stable_sort() 的规范中,以确保稳定的排序可供这些人使用需要他们。这也是一种可以很容易地填充的东西。那么,为什么不发送电子邮件进行 es-discuss 讨论,看看是否有人有兴趣撰写提案呢? --- 如果我们有,那么我们可以继续以我们目前的方式进行基准测试:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 2015-11-16
相关资源
最近更新 更多