【问题标题】:Separating Date strings into JS Object将日期字符串分离为 JS 对象
【发布时间】:2013-07-12 16:54:09
【问题描述】:

我正在构建一个从 RSS 提要获取 JS 对象输入的日历。这个 RSS 提要是从我公司内部使用的 CMS 自动生成的。我无法更改 CMS 方面的任何内容,也无法更改返回的 RSS 提要。我只能访问从该提要构建的对象。

RSS 提要将开始日期、结束日期、时间和标题全部连接在一个字符串中。我需要将它们分成对象中的键,以便我的日历可以显示它们。

我遇到的问题是 RSS 提要根据事件在 CMS 中的设置方式来设置不同的字符串格式。例如:

"7/15/2013 8:00 PM - 9:00 PM Blah" //Date, Time, Title
"7/12/2013 Blue" //Date for all day event, Title
"7/6/2013 8:00 AM - 7/23/2013 9:00 AM Banana" //Long event - Start Date, Start Time, End Date, End Time, Title

如您所见,它们有多么不同,我很难决定如何将它们解析到我的对象中。该对象应如下所示:

{
    title: 'Banana',
    start: new Date(2013, 7, 24, 10, 30),
    end: new Date(2013, 7, 24, 11, 30),
    allDay: false
}

我的问题归结为:解决此问题的最佳方法是什么?使用正则表达式,尝试使用 .indexOf("/") 之类的东西手动解析它,为每一个构建测试用例,或其他一些建议。

PS:jQuery 示例也是一个可以接受的答案。

【问题讨论】:

  • 那不是 JSON,那只是一个 Javascript 对象。您是在问如何使用 Javascript 解析这些日期?
  • @nullability 是的。我对同时从事的另一个项目感到困惑。更新了问题。

标签: javascript jquery json date


【解决方案1】:

你能使用像Datejs这样的库吗?

您可能希望在“ - ”(带空格)上开始拆分。如果你有一个部分,你知道这是一个有标题的全天活动。如果它是两部分,您就知道这是一个开始/结束事件,并且在第二部分中有一个标题。解析出标题后,就可以使用 Datejs 来创建 Date 对象了:

Date.parse('7/15/2013 8:00 PM')

从那里你应该有足够的东西来构建你的 JSON 对象。

【讨论】:

  • 好主意,正是我开始所需要的。
  • -1 用于 Datejs。自 2007 年以来的 Alpha-1,126 个未解决的问题,自 2008 年以来没有开发。如果您想要一个这样做的库并维护,请查看moment.js
  • 感谢您的意见。我从来没有声称 Datejs 是最好的,或者我在所有 JavaScript 日期库上都是最新的。
  • 没问题。只要确保你知道。 DateJS 是个好主意,但他们失败了。
【解决方案2】:

根据 Jon 的回答,这就是我最终得到的结果:

parseEntries: function() {
    //Rename to fit plugin requirements
    for (var i = 0; i < Calendar.entries.length; i++) {
        var entry = Calendar.entries[i];

        //Rename
        entry["url"] = entry["link"];
        delete entry["link"];

        var position = entry.title.indexOf(' - ');

        if (position === -1) {
            //All day event
            entry.allDay = true;
            var space = entry.title.indexOf(" "),
                title = entry.title.substring(space + 1),
                firstHalf = entry.title.slice(0, space); //Start date, no time because it's all day event
        } else {
            var firstHalf = entry.title.slice(0, position), //Start date/time
                secondHalf = entry.title.substring(position + 3);

            if (secondHalf.indexOf("AM") !== -1) {
                var title = secondHalf.substring(secondHalf.indexOf("AM") + 3); //Title if has AM
            } else {
                var title = secondHalf.substring(secondHalf.indexOf("PM") + 3); //Title if has PM
            }

            secondHalf = secondHalf.slice(0, -(title.length + 1)); //End date/time
        }

        entry["start"] = firstHalf;
        entry["end"] = secondHalf;
        entry.title = title;
    };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2020-11-30
    • 2023-03-20
    • 2011-03-07
    相关资源
    最近更新 更多