0

我正在构建一个从 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 示例也是一个可以接受的答案。

4

2 回答 2

1

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

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

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

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

于 2013-07-12T17:10:18.977 回答
0

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

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;
    };
于 2013-07-12T18:07:14.423 回答