javascript计算日期范围的价格

javascript calculate price for date ranges

本文关键字:范围 计算 日期 javascript      更新时间:2023-09-26

我有一个关于javascript时间范围的问题

我有两个输入框,客户可以给出开始日期和结束日期

下面有3个季节的日期范围,我需要计算用户输入的日期范围的成本价格低于季节的映射

总共是3个季节,下面是日期范围:

淡季

5月1日至6月30日9月1日至12月14日

成本:每天5美元


旺季

1月11日至4月30日7月1日至8月31日

成本:每天10美元


旺季

-12月15日至1月10日成本:每天2美元

我写了一个代码来获取日期输入

$('#calculate').click(function(){
//get the first date
da=$('#daydropdowna').val();
ma=$('#monthdropdowna').val();
ya=$('#yeardropdowna').val();

//get the secnd date
dd=$('#daydropdownd').val();
md=$('#monthdropdownd').val();
yd=$('#yeardropdownd').val();

var oneDay = 24*60*60*1000; 
var ourstart= new Date(ya,ma,da);
var oursend= new Date(yd,md,dd);

/*
11th January to 30th April 
1st July to 31st August 
*/
var hsstart= new Date(ya,00,11);
var hsend= new Date(ya,03,11);
var hsstart1= new Date(ya,06,01);
var hsend1= new Date(ya,07,31);

/*
1st May to 30th June 
1st September to 14th December 
*/
var lsstart=new Date(ya,04,01);
var lsend=new Date(ya,05,30);
var lsstart1=Date(ya,08,01);
var lsend1=new Date(ya,11,14);

/*
-15th December - 10th January 
*/
var psstart=new Date(ya,11,15);
var psend=new Date(ya+1,00,10);

var myDate = ourstart;
var myDate1 = oursend;


var startDate = hsstart
var endDate = hsend

//the date range within one high season
if ((startDate < myDate) && (myDate < endDate) && (startDate < myDate1) && (myDate1 < endDate)) {
        alert('seasn 1 h');
       var diffDays = Math.round(Math.abs((myDate1 .getTime() - myDate .getTime())/(oneDay)));
alert (diffDays);
}

//the date range within secnd high season
var startDate = hsstart1
var endDate = hsend1
if ((startDate < myDate) && (myDate < endDate) && (startDate < myDate1) && (myDate1 < endDate)) {
        alert('seasn 2 h');
       var diffDays = Math.round(Math.abs((myDate1 .getTime() - myDate .getTime())/(oneDay)));
alert (diffDays);
}

//the date range within first low season
var startDate = lsstart
var endDate = lsend
if ((startDate < myDate) && (myDate < endDate) && (startDate < myDate1) && (myDate1 < endDate)) {
        alert('season 1 l');
       var diffDays = Math.round(Math.abs((myDate1 .getTime() - myDate .getTime())/(oneDay)));
alert (diffDays);
}

//the date range within second low season
var startDate = lsstart1
var endDate = lsend1

if ((startDate < myDate) && (myDate < endDate) && (startDate < myDate1) && (myDate1 < endDate)) {
        alert('season 2 l');
       var diffDays = Math.round(Math.abs((myDate1 .getTime() - myDate .getTime())/(oneDay)));
alert (diffDays);
}
//peak
var startDate = psstart
var endDate = psend
if ((startDate < myDate) && (myDate < endDate) && (startDate < myDate1) && (myDate1 < endDate)) {
        alert('season p');
       var diffDays = Math.round(Math.abs((myDate1 .getTime() - myDate .getTime())/(oneDay)));
alert (diffDays);
}

//if not wihin a specific range cacuate for all





});

所以我需要根据用户输入来计算总价,Ex用户输入2012-05-05-2013-01-05这需要计算3个季节日期的价格,这涵盖了日期范围。请帮我解决这个问题,谢谢。。。

我不打算为您编码,但逻辑如下:

tempDate = inputStartDate
for each season
    if seasonStart <= tempDate
        if inputEndDate <= seasonEnd
            price = price + (inputEndDate - tempDate) * seasonCost
            break
        else
            price = price + (seasonEnd - tempDate) * seasonCost
            tempDate = seasonEnd + 1 day

price将包含整个日期范围的总成本/天。

听起来,你需要的是一点帮助来分解你的工作;)

我想解决这个问题的方法是设计一个自定义的dateRangeDistance函数。你想给出一个开始日期,找出那天比你的某个范围结束日期早多少天,然后给出一个结束日期,计算出比它所在的日期范围早多少天。我也会把你的日期范围定义为地图,而不是那些讨厌的变量。

var peakSeason = {startDate: w/e, endDate: w/e, numDays: w/e, costRatePerDay: w/e}
var lowSeason1 = {startDate: w/e, endDate: w/e, numDays: w/e, costRatePerDay: w/e}
var lowSeason2 = {startDate: w/e, endDate: w/e, numDays: w/e, costRatePerDay: w/e}
// .... etc
var allSeasons = [peakSeason, lowSeason1, ...] // put these in order and it can help iterating date ranges between
var numberDaysStartFromEndOfRange = function(startDate) {
    // iterate through the allSeasons map and find what range this is in 
    // return {numDays: whateverYouCalculate, dateRange: name your date ranges uniquely}
}
var numberDaysEndFromStartOfRange = function(startDate) {
    // iterate through the allSeasons map and find what range this is in
    // return {numDays: whateverYouCalculate, dateRange: name your date ranges uniquely}
}

实际上,你可以让这些函数成为同一个函数,并传递第二个参数来判断你是从前面计数还是从后面计数。不过,这应该会让你走上正轨。如果你需要更多的帮助,你可以问,但你也需要明白,这不是一个为你编写算法的网站;)

一句话:利用一些辅助函数和数据结构的映射来帮助将工作分解为更易于管理的块!