获取从字符串中检索的两个日期之间的所有日期并创建一个字符串

时间:2013-09-15 16:18:16

标签: javascript

我有一个如下字符串:

#CI[20131229]CO[20131231]PV1,#CI[20130918]CO[20130919]PV3,#CI[20131009]CO[20131011]PV3,#CI[20131226]CO[20140103]PV4,#CI[20131226]CO[20140103]PV3

....列表以相同的格式继续。格式为:

,# = entry seperator
CI[YYYYMMDD] = Check In Date
CO[YYYYMMDD] = Check Out Date
PVx = Room Number

我希望在办理入住和退房时获取所有日期,但签入结帐日期除外,并将其设置为字符串(如果是上面的字符串):

#20131230PV1,#20131010PV3,#20131227PV3,#20131228PV3,#20131229PV3,#20131230PV3,#20131231PV3,#20140101PV3,#20140102PV3

我需要单独检索CheckIn日期和结帐日期 我成功地做到了这一点:

bookcaldatesci.innerHTML = bookcaldates.innerHTML.replace(/CO[^\]]+\]/ig, "");
bookcaldatesci.innerHTML = bookcaldatesci.innerHTML.replace(/CI\[/ig, "");
bookcaldatesci.innerHTML = bookcaldatesci.innerHTML.replace(/\]/ig, "");
bookcaldatesco.innerHTML = bookcaldates.innerHTML.replace(/CI[^\]]+\]/g, "");
bookcaldatesco.innerHTML = bookcaldatesco.innerHTML.replace(/CO\[/ig, "");
bookcaldatesco.innerHTML = bookcaldatesco.innerHTML.replace(/\]/ig, "");
jQuery.noConflict();
$(bookcaldatesci.innerHTML).css({'background-image':'url("img/booked.jpg")','background-repeat':'no-repeat','background-position-y':'100%','background-size':'100% 50%'});
$(bookcaldatesco.innerHTML).css({'background-image':'url("img/booked.jpg")','background-repeat':'no-repeat','background-size':'100% 50%'});

但是为了在日期范围之间添加日期,我有点迷失..

(我得到答案:检查,检查我的答案)

3 个答案:

答案 0 :(得分:2)

您可以将问题分解为两个子问题:

  1. 将您的字符串解析为具有两个日期和房间号的对象。
  2. 查找两个给定日期之间的日期。
  3. 对于第一个子问题,您可以使用正则表达式和Date对象构造函数。

    function parseDate(date) {
        return new Date(date.substring(0,4), date.substring(4,6)-1, date.substring(6,8));
    }
    
    var input = '#CI[20131229]CO[20131231]PV1,#CI[20130918]CO[20130919]PV3,#CI[20131009]CO[20131011]PV3,#CI[20131226]CO[20140103]PV4,#CI[20131226]CO[20140103]PV3';
    
    var regExp  = /CI\[(\d{8})\]CO\[(\d{8})\](PV\d)/g;
    var items = [];
    var match = regExp.exec(input);
    while(match != null) {
        items.push({
            ci : parseDate(match[1]),
            co : parseDate(match[2]),
            room : match[3]
        });
        match = regExp.exec(input);
    }
    

    对于第二个子问题,您可以使用循环生成两个日期之间的所有日期:

    function daysBetween(startDate, endDate) {
        var days = [], current = startDate;
        while(current <= endDate) {
            days.push(current);
            current = new Date(current.getTime() + (24 * 60 * 60 * 1000));
        }
        return days;
    }
    

答案 1 :(得分:1)

您需要在每次签入和签出之间进行日期差异,并使用该值执行for循环。因此对于该值为1,只需将for值添加到整个循环的检入日期。导读每组签出日期的最简单方法可能是使用正则表达式或基于查找字符串值的循环。

答案 2 :(得分:0)

经过几个小时的尝试,我想出了答案。它将产生以下结果:

#30122013PV1,#10102013PV1,#27122013PV1,#28122013PV1,#29122013PV1,#30122013PV1,#31122013PV1,#112014PV1,#212014PV1,#27122013PV1,#28122013PV1,#29122013PV1,#30122013PV1,#31122013PV1,#112014PV1,#212014PV1,

这是代码

<div id=oo></div>
<div id=pp>#CI[20131229]CO[20131231]PV1,#CI[20130918]CO[20130919]PV3,#CI[20131009]CO[20131011]PV3,#CI[20131226]CO[20140103]PV4,#CI[20131226]CO[20140103]PV3</div>

<script>

function daysBetween(startDate, endDate , roomNum) {
var days = [], current = startDate;
current.setDate(startDate.getDate()+1);
endDate.setDate(endDate.getDate()-1);
while(current <= endDate) {
var d0 = new Date(current);
var d1 = d0.getDate();
var d2 = d0.getMonth()+1
var d3 = d0.getFullYear()
var d4 = roomNum
oo.innerHTML = oo.innerHTML + "#" + d1 + "" + d2 + "" + d3 + "" + d4 + ",";
days.push(current);
    current = new Date(current.getTime() + (24 * 60 * 60 * 1000));   

}
return days + "," + roomNum;
}

function parseDate(date) {
return new Date(date.substring(0,4), date.substring(4,6)-1, date.substring(6,8));
}


var input = pp.innerHTML;
var regExp  = /CI\[(\d{8})\]CO\[(\d{8})\](PV\d)/g;
var items = [];
var match = regExp.exec(input);
while(match != null) {
items.push({
    ci : parseDate(match[1]),
    co : parseDate(match[2]),
    room : match[3]
});

match = regExp.exec(input);

}

for (var i = 0; i < items.length; i++) {
daysBetween(new Date(items[i]['ci']), new Date(items[i]['co']), items[0]['room']);
}


</script>