将Date字符串分隔为JS Object

时间:2013-07-12 16:54:10

标签: javascript jquery json date

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

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

我遇到的问题是RSS Feed会根据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示例也是可以接受的答案。

2 个答案:

答案 0 :(得分:1)

您是否可以使用Datejs等库?

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

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

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

答案 1 :(得分:0)

根据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;
    };