1

我有一个如下字符串:

#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 日期和 Checkout 日期我成功地做到了这一点:

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%'});

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

(我得到了答案:要检查,请在下面检查我的答案)

4

3 回答 3

2

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

  1. 将您的字符串解析为具有两个日期和一个房间号的对象。
  2. 查找两个给定日期之间的天数。

对于第一个子问题,您可以使用正则表达式和 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;
}
于 2013-09-15T17:17:49.800 回答
1

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

于 2013-09-15T16:33:49.570 回答
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>
于 2013-09-21T20:43:34.310 回答