【问题标题】:Efficiently Comparing JSON Dates to a JS Date Object有效地将 JSON 日期与 JS 日期对象进行比较
【发布时间】:2013-06-12 18:22:50
【问题描述】:

我有来自 SQL 查询 [{date, text, desc},{,,,}] 的 JSON,我需要将日期 (date1, date2, ...) 与多个其他 JS 日期 对象进行比较 (b1, b2, ...) 高效。

问题是:目前我必须将每个 JSON 日期转换为 JS 日期对象,然后才能进行比较,例如:

(date1->a1) then (a1 to b1)
else (date2->a2) then (a2 to b1)
else (daten->an) then (an to b1)
... then
(date1->a1) then (a1 to b2)
else (date2->a2) then (a2 to b2)
else (daten->an) then (an to b2)
... and again for each b

我正在寻找一种更有效的方法来进行这种转换比较,因为可能有 ~90 'a's 和 30-90'b's。

附加信息:

  • JSON 日期为 DESC
  • JS 日期为 ASC
  • 比较的实现类似于How do I format a Microsoft JSON date?
  • 当日期匹配时,返回要处理的 JSON 对象
  • 如果没有日期匹配,则返回 false
  • 如果 b > a,我确实可以提前退出,但早期很多人不会符合此标准

我在 JS 函数中使用它来将“文本”字段插入到 Google 图表的表格中。

非常感谢您提前查看我的问题!

示例 JSON:

[
  {
    "id": 797,
    "title": "test",
    "description": "test",
    "annotationDate": {
      "date": "2013-06-02 00:00:00",
      "timezone_type": 3,
      "timezone": "America\/Los_Angeles"
    },
    "discr": "annotation"
  },
  {
    "id": 806,
    "title": "recent",
    "description": null,
    "annotationDate": {
      "date": "2013-06-01 00:00:00",
      "timezone_type": 3,
      "timezone": "America\/Los_Angeles"
    },
    "discr": "annotation"
  }
]

示例 JS 日期对象:

Date {Sat Jun 01 2013 11:19:35 GMT-0700 (PDT)}
Date {Sun Jun 02 2013 11:19:35 GMT-0700 (PDT)}
Date {Mon Jun 03 2013 11:19:35 GMT-0700 (PDT)}
Date {Tue Jun 04 2013 11:19:35 GMT-0700 (PDT)}

【问题讨论】:

    标签: javascript json algorithm google-visualization


    【解决方案1】:

    对于每个查询日期,将其转换为带有Number(d) 的数字,并存储在字典(JavaScript 对象)中。循环遍历 JSON 对象,并将每个日期字符串转换为 Date 对象,然后转换为数字。检查字典中是否存在此号码。

    function filterCharts(json, dates)
    {
        var origin = new Date("2000-01-01T00:00:00");
    
        var dateLookup = {};
        for (var i = 0; i < dates.length; i++)
        {
            var key = dates[i] - origin; // milliseconds
            key = Math.round(key / 86400000); // days
            dateLookup[key] = true;
        }
    
        var result = [];
        for (var i = 0; i < json.length; i++)
        {
            var jsonDate = new Date(json[i].annotationDate.date.replace(" ", "T"));
            var key = jsonDate - origin; // milliseconds
            key = Math.round(key / 86400000); // days
            if (dateLookup[key])
            {
                result.push(json[i]);
            }
        }
    
        return result;
    }
    

    我不知道你想如何管理时区,所以我会留给你。

    【讨论】:

    • 非常感谢,让我开始了我对这个实现的变体(将日期本身存储为键)!不过我必须问,var x = {} 与 var y = [] 之间的数据结构/区别是什么?
    • 另外,你知道为什么我把var jsonDate = new Date(json[i].annotationDate.date); 作为无效日期吗?我必须将其转换为字符串并使用 setFullyear、setMonth、setDate 来设置日期!
    • Ecma 脚本标准将有效的日期字符串定义为&lt;date&gt;&lt;date&gt;T&lt;time&gt;&lt;date&gt;T&lt;time&gt;&lt;timezone&gt;。日期的格式为 yyyyyyyy-mmyyyy-mm-dd。时间格式为hh:mmhh:mm:sshh:mm:ss.fff。时区的格式为 Z+hh:mm-hh:mm。根据 JavaScript 引擎,允许有细微的变化。如果您将空格替换为 T,则它遵循规范,并且应该解析为有效日期。
    • {} 是一个空的 JavaScript 对象。它可以用作字典,但有一些限制。 [] 是一个空列表。
    • 谢谢你,你已经帮我解决了,当我再次检查我的代码时,我会考虑你的日期时间标准。非常感谢!
    猜你喜欢
    • 2014-02-12
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    相关资源
    最近更新 更多