Hello and welcome to our community! Is this your first visit?
Enjoy an ad free experience by logging in. Not a member yet? Register.

1. ## Period of year

Hi all

First I must say that I'm complete new in javascript. I've done something in php, but not in javascript.

My problem is calculation for accomodation.

I've got 5 periods of year

01/01 - 28/05
29/05 - 02/07
03/07 - 03/09
04/09 - 01/10
02/10 - 31/12

Each period of year has his price for accomodation

for example:

01/01 - 28/05 35€
29/05 - 02/07 45€
03/07 - 03/09 55€
04/09 - 01/10 45€
02/10 - 31/12 35€

Here comes problem

If user wants to spend his vacation on period from 28.06 until 07.07 here come two prices.

Calculation should be: 5 days at price 45€ and 5 day on price 55€

Total of this should be 500€.

How to make function to determine period of year

• Any suggestions?

• Code:
function mkPeriod(startDate,startMonth,endDate,endMonth,price) {
return {
sd: startDate,
sm: startMonth,
ed: endDate,
em: endMonth,
p: price
};
}
var periods = [
mkPeriod(0,0,28,4,35),
mkPeriod(29,4,2,6,45),
mkPeriod(3,6,3,8,55),
mkPeriod(4,8,1,9,45),
mkPeriod(2,9,31,11,35)
]
Date.prototype.getNextDay = function() {
var x = this;
x.setDate(x.getDate()+1);
return x;
}
Date.prototype.getPeriodPrice = function() {
var startP,endP,y = this.getFullYear();
for(var i = 0; i < periods.length; i++) {
startP = new Date(y,periods[i].sm,periods[i].sd);
endP = new Date(y,periods[i].em,periods[i].ed);
if(this>=startP&&this<=endP)
return periods[i].p;
}
}

function determinePrice(dateBegin,dateEnd) {
var price = 0;
while(dateBegin<=dateEnd) {
price += dateBegin.getPeriodPrice();
dateBegin = dateBegin.getNextDay();
}
return price;
}
Granted, there is a problem if you want the price of a vacation that spans between more than the current year, but otherwise, it should be a pretty good solution.

Hope that helps!

Happy coding!

• Looks like nolachrymose has beaten me to the solution! But I've been working on this for a little while, so I thought I'd post my solution as well.

My solution does take 2 years into account..

Mine's also a lot longer than his! But it makes more sense to me..
Code:
<script>
var tdyDate = new Date();
var tdyYear = tdyDate.getFullYear();

var period = new Array();

var j = 0;
for(var i = 0; i < 2; i++) {
period[j] = new Array();
period[j]['start'] = new Date(tdyYear+i, 01, 01);
period[j]['end'] = new Date(tdyYear+i, 05, 28);
period[j++]['price'] = 35;

period[j] = new Array();
period[j]['start'] = new Date(tdyYear+i, 05, 29);
period[j]['end'] = new Date(tdyYear+i, 07, 02);
period[j++]['price'] = 45;

period[j] = new Array();
period[j]['start'] = new Date(tdyYear+i, 07, 03);
period[j]['end'] = new Date(tdyYear+i, 09, 03);
period[j++]['price'] = 55;

period[j] = new Array();
period[j]['start'] = new Date(tdyYear+i, 09, 04);
period[j]['end'] = new Date(tdyYear+i, 10, 01);
period[j++]['price'] = 45;

period[j] = new Array();
period[j]['start'] = new Date(tdyYear+i, 10, 02);
period[j]['end'] = new Date(tdyYear+i, 12, 31);
period[j++]['price'] = 35;
}

function ms_to_days(diff) {
return (Math.floor(diff / (1000 * 60 * 60 * 24)) + 1);
}

function calculateCost(startDate, endDate) {
var cost = 0;
var days = 0;

var d;
for(var i = 0; i < period.length; i++) {
if(period[i]['start'].getTime() <= startDate.getTime() && startDate.getTime() <= period[i]['end'].getTime()) {
//this is the starting period

if(period[i]['start'].getTime() <= endDate.getTime() && endDate.getTime() <= period[i]['end'].getTime()) {
//this is ALSO the ending period
//cost should bee the diff in days between the startDate and endDate

var diff_dates = endDate.getTime() - startDate.getTime();

d = ms_to_days(diff_dates);
days += d;
cost += d*period[i]['price'];
break;
}
else {
//this is NOT the ending period
//cost is at least the diff in days between the startDate and the end of period date

var diff_till_end = period[i]['end'].getTime() - startDate.getTime();

d = ms_to_days(diff_till_end);
days += d;
cost += d*period[i]['price'];
}//else
}
else if(startDate.getTime() < period[i]['start'].getTime()) {
//start date is before this period..

if(period[i]['end'].getTime() <= endDate.getTime()) {
//end date is after this period
//cost is the length of this period in days

var diff_period = period[i]['end'].getTime() - period[i]['start'].getTime();

d = ms_to_days(diff_period);
days += d;
cost += d*period[i]['price'];
}
else {
//end date is also in this period
//cost is the diff of the end date and the start of this period

var diff_from_start = endDate.getTime() - period[i]['start'].getTime();

d = ms_to_days(diff_from_start);
days += d;
cost += d*period[i]['price'];
break;
}//else
}//else if

}//for

return cost;
}

//test
alert( calculateCost(new Date(2004, 05, 28), new Date(2005, 05, 29)) );
</script>
Hopefully that's of some help.

• thank you both.
I'll try your codes soon I come home (I'm at work now), and I'll let you know results.

Regards

• Thank you Sadiq, script is working fine and it is a great help for me, but I think that something is calculating wrong.

Price for period from 28.06.2004 untill 07.07.2004 should be 445€, and script calculates 545€.

28.06.2004 45,00 €
29.06.2004 45,00 €
30.06.2004 45,00 €
01.07.2004 45,00 €
02.07.2004 45,00 €
03.07.2004 55,00 €
04.07.2004 55,00 €
05.07.2004 55,00 €
06.07.2004 55,00 €

Total: 445,00 €

If you would be so kind and check code please

Regards

Thank you

• Oops! I think I know why:

Javascript dates start at 0, not 1. So I just substracted the months and days by 1 and it seems to work:
Code:
var period = new Array();

var j = 0;
for(var i = 0; i < 2; i++) {
period[j] = new Array();
period[j]['start'] = new Date(tdyYear+i, 00, 00);
period[j]['end'] = new Date(tdyYear+i, 04, 27);
period[j++]['price'] = 35;

period[j] = new Array();
period[j]['start'] = new Date(tdyYear+i, 04, 28);
period[j]['end'] = new Date(tdyYear+i, 06, 01);
period[j++]['price'] = 45;

period[j] = new Array();
period[j]['start'] = new Date(tdyYear+i, 06, 02);
period[j]['end'] = new Date(tdyYear+i, 08, 02);
period[j++]['price'] = 55;

period[j] = new Array();
period[j]['start'] = new Date(tdyYear+i, 08, 03);
period[j]['end'] = new Date(tdyYear+i, 09, 00);
period[j++]['price'] = 45;

period[j] = new Array();
period[j]['start'] = new Date(tdyYear+i, 09, 01);
period[j]['end'] = new Date(tdyYear+i, 11, 30);
period[j++]['price'] = 35;
}
Let me know how it goes.

• BTW: Although the O/P neglected to update this thread to indicate the accepted solution.
For the archives here, I will post solution which was accepted elsewhere....

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<title>Untitled</title>
<script type="text/javascript">
<!--
var period1=40;
var period2=50;
var period3=60;
var period4=50;
var period5=40;
// -->
</script>
<script type="text/javascript">
<!--
Date.prototype.getRate = function () {
if (this.getTime() < new Date(this.getFullYear(), 4, 29)) return period1;
if (this.getTime() < new Date(this.getFullYear(), 6, 3)) return period2;
if (this.getTime() < new Date(this.getFullYear(), 8, 4)) return period3;
if (this.getTime() < new Date(this.getFullYear(), 9, 2)) return period4;
return period5;
}
Date.ONE_SECOND = 1000;
Date.ONE_MINUTE = Date.ONE_SECOND * 60;
Date.ONE_HOUR = Date.ONE_MINUTE * 60;
Date.ONE_DAY = Date.ONE_HOUR * 24;
function getPrice (startDate, endDate) {
var a = 0;
var d = new Date (startDate);
var e = new Date (endDate);
while (d < e) {
a += d.getRate();
d = new Date(d.getTime() + Date.ONE_DAY)
}
return a;
}
alert (getPrice ('5 may 2004', '7 may 2004'))
// -->
</script>
<body>
</body>
</html>

•

#### Posting Permissions

• You may not post new threads
• You may not post replies
• You may not post attachments
• You may not edit your posts
•