Javascript 以更聪明的方式进行大量的日期比较

Javascript 以更聪明的方式进行大量的日期比较,javascript,Javascript,我正在制作一个预订系统,在这里我必须根据旺季/淡季等提高或降低价格 以下是Alessandro提供的一些良好帮助后的最后一个函数:) 它现在可以工作,而不需要在一年的季节阵列 var seasonArray = [ { "season": "HIGH Season", "from": 101, "to": 315, "pct": 30 }, {

我正在制作一个预订系统,在这里我必须根据旺季/淡季等提高或降低价格

以下是Alessandro提供的一些良好帮助后的最后一个函数:) 它现在可以工作,而不需要在一年的季节阵列

    var seasonArray = [ 
        {
            "season": "HIGH Season",
            "from": 101,
            "to": 315,
            "pct": 30
        },
        {
            "season" : "MIDDLE Season",
            "from": 316,
            "to": 615,
            "pct" : 10
        },
        {
            "season" : "LOW Season",
            "from": 616,
            "to": 915,
            "pct" : -10
        }
    ]

    var checkin  = Date.parse('2017-01-01 00:00:00')
    var checkout = Date.parse('2017-09-05 00:00:00')

    calcPrice(checkin, checkout);

function calcPrice(checkin, checkout){
    var nights    = daysBetween(new Date(checkin), new Date(checkout))
    var totPrice  = calcPeriod(nights,checkin);
    var avgPrice  = Math.round(totPrice/nights);
    totPrice      = avgPrice * nights //compensate for math.round difference
    var finalPrice = 0;
    for (var d = new Date(checkin); d <= checkout; d.setDate(d.getDate() + 1)) {
        dn = Number((d.getMonth()+1) + ('0' + d.getDate()).slice(-2)) 
        var season = seasonArray.find(item => {
           return item.from <= dn && item.to >= dn
        });
        var pct = season ? season.pct : 0;
        finalPrice += avgPrice * (1 + pct / 100);
    }
    finalPrice = Math.round(finalPrice)
    console.log('totPrice: ' + totPrice)
    console.log('finalPrice: ' + finalPrice)
}
var数组=[
{
“季节”:“旺季”,
“from”:101,
“至”:315,
“pct”:30
},
{
“季节”:“中期”,
“from”:316,
“至”:615,
“pct”:10
},
{
“季节”:“淡季”,
“from”:616,
“至”:915,
“pct”:-10
}
]
var checkin=Date.parse('2017-01-01 00:00:00')
var checkout=Date.parse('2017-09-05 00:00:00')
计算(签入、签出);
功能计算(签入、签出){
var nights=两天之间(新日期(签入)、新日期(签出))
var totPrice=calcPeriod(夜间,入住);
var avgPrice=数学轮(总价/夜);
totPrice=avgPrice*nights//math.round差异补偿
var finalPrice=0;
对于(var d=新日期(签入);d{
return item.from=dn
});
var pct=季节?季节。pct:0;
最终价格+=平均价格*(1+pct/100);
}
最终价格=数学轮(最终价格)
console.log('totPrice:'+totPrice)
console.log('finalPrice:'+finalPrice)
}

您可以使用如下方法:

  • 创建一个日期范围为的数组(在我的示例中,您可以使用变量轻松更改当前年份)
  • 每天从签入到签出循环
  • 最后使用
    find
    功能获得调整最终价格的正确“季节”
请参见我的示例开始(可以改进):

var数组=[{
“季节”:“旺季”,
“from”:日期解析('2017-01-01 00:00:00'),
“to”:Date.parse('2017-03-15 23:59:59'),
“pct”:30
}, {
“季节”:“中期”,
“from”:日期解析('2017-03-16 00:00:00'),
“to”:Date.parse('2017-06-15 23:59:59'),
“pct”:10
}, {
“季节”:“淡季”,
“from”:日期解析('2017-06-16 00:00:00'),
“to”:Date.parse('2017-09-15 23:59:59'),
“pct”:-10
}]
var checkin=Date.parse('2017-01-06 00:00:00');
var checkout=Date.parse('2017-05-18 00:00:00');
var天数=(签出/1000-签入/1000)/86400//每天几秒钟
var totPrice=13200;
var avgPrice=总价格/天;
var finalPrice=0;
对于(var d=新日期(签入);d{
return item.from=d
});
var pct=季节?季节性:0 ;;
最终价格+=平均价格*(1+pct/100);
}

console.log(“最终价格为:”+最终价格)向我们展示您的代码而不是伪代码请让我先做一点清理工作,这样它才像样:-DDon不会清理您的代码。向我们展示您所拥有的,我们将帮助您优化它感谢您这么多Alessandro-非常优雅的解决方案,而且它很有效!!除了一件小事。季节应该每年都有效,所以我们不能将“2017”放在季节数组中。有没有办法修复
项目。from=d
这样它会自动将年份从“d”改为“from/to”项目?嗯,不,这行不通-将from/to项目视为116=1月16日和1224=12月24日这样的数字,然后将“d”改为相同的数字如何?是的,这就成功了-我将在上面的问题中发布,这样你就可以看到了。而且非常快!非常感谢你的帮助。我很高兴它帮助了你。。。再见