Пересчитать сумму за прошедшие время по тарифам
Привет, господа программисты!
Нуждаюсь в Вашей помощи, задался задачей, мне кажется довольно интересной и застрял. Идея такая: при открытие страницы(или при клике на кнопку, не суть, сам разберусь потом, главное механизм) у пользователя в локальную память сохраняется текущие время и он может даже уйти со страницы(или остаться наблюдать за пересчетом в реально времени, опять же потом сам повешу на таймаут, чтобы выводился пересчет в реальном времени), зайдя через некоторое время он должен получить сумму из расчета пройденного времени и тарифов. 15.00 - 18.00: час стоит 150p 18.00 - 21.00: час стоит 210p 21.00 - 00.00: час стоит 300p 00.00 - 03.00: час стоит 360p Пример. Человек зашел, записалось время 11:03:54, он вышел и зашел в 20:45:12, ему должно все пересчитаться исходя из тарифов С 11:03:54 по 14:59:59(ставка 0) - ((пройденное время в минутах) * 0 = 0 рублей за текущий период с 15:00:00 по 17:59:59(ставка 2,5 руб/мин) - ((пройденное время в минутах) * 2,5 = 450 рублей с 18:00:00 по 20:45:12(ставка 3,5 руб/мин) - ((пройденное время в минутах) * 3 = 577,5 рублей Далее все полученные данные складываются(0+450+577,5) и показываются пользователю 1027,5 рублей за период с 11:03:54 по 20:45:12 Ломаю голову уже какой день, как реализовать такой пересчет динамически, чтобы работало с любым кол-вом диапазоном, чтобы даже зайдя через сутки правильно считало, а также и в пределах одного часа, чтобы можно было добавлять и убирать элементы из объекта(потом будет динамически), пока скрипт в таком зачаточном состоянии, не знаю куда двигаться дальше и правильную ли я выбрал структуру хранения первичных данных(объект с тарифами, дата в переменной и т.д.)
var now,hours,min,sec,realTime;
function checkTime(i){
if (i<10){
i="0" + i;
}
return i;
}
now = new Date();
hours = checkTime(now.getHours());
min = checkTime(now.getMinutes());
sec = checkTime(now.getSeconds());
realTime = hours + ":" + min + ":" + sec;
if (!localStorage['time']) {
localStorage['originTime'] = now.getTime(); // записываем начальное время посещения в миллисекундах для расчета
localStorage['time'] = hours + ":" + min + ":" + sec; // записываем начальное время посещения в человеческом виде для вывода и сравнения
}
var tarifSetka = { // объект с данными
time1: {
run: '15:00:00',
end: '17:59:59',
tarif: 150
},
time2: {
run: '18:00:00',
end: '20:59:59',
tarif: 210
},
time3: {
run: '21:00:00',
end: '23:59:59',
tarif: 300
},
time4: {
run: '00:00:00',
end: '02:59:59',
tarif: 360
},
time5: {
run: '03:00:00',
end: '14:59:59',
tarif: 0
}
};
//console.log(tarifSetka);
//console.log(localStorage['time']);
//console.log(realTime);
for (var o=1;o <= (Object.keys(tarifSetka).length);o++) {
if (localStorage['time'] >= (tarifSetka['time'+o].run) && localStorage['time'] <= (tarifSetka['time'+o].end)) {
var tarifRun = tarifSetka['time'+o].tarif; //узнаем в цикле какой тариф соответствует текущему времени
}
}
var gameTime = parseInt(((now.getTime() - localStorage['originTime'])/1000)/60); // считаем сколько прошло времени с начального момента
Вот так, а дальше затык, вообще не знаю куда двигаться, помогите, как реализовать и реально ли подобное вообще сделать? |
Spamol,
мысли вслух ... делим диапазон в 0 часов...а в течении одних суток можно так
function cost(run, end)
{
var time = {0:6,3:0,15:2.5,18:3.5,21:5},
sum = 0, min = 0;
for (var i=0; i< 24; i++) {
if(i in time) min = time[i];
if(i >= run[0]) {sum += (60-run[1])*min ; run[1]=0};
if(i+1 > end[0]) {sum -= (60-end[1])*min; break};
}
return sum
}
alert(cost([11,3],[20,45]) )
|
рони,
Спасибо, интересный вариант. |
Хотя косяк, в пределах одного часа получаются отрицательные числа
http://jsbin.com/IYaROfo/1/edit?js,output |
Spamol, строка 6 >=
function cost(run, end){
var time = {0:6,3:2,15:2.5,18:3.5,21:5},
sum = 0, min = 0;
for (var i=0; i< 24; i++) {
if(i in time) min = time[i];
if(i >= run[0]) {sum += (60-run[1])*min; run[1]=0;};
if(i+1 > end[0]) {sum -= (60-end[1])*min; break;};
}
return sum;
}
alert(cost([11,3],[11,45]) );
alert((45-3)*2);
|
Спасибо, чет пытаюсь вкурить какой день, как Ваш скрипт работает, вроде объекты вижу, массивы вижу, циклы и условия понимаю, но как Вы так все это закрутили виртуозно, никак не могу разобрать по полочкам)
Но главное все работает! |
| Часовой пояс GMT +3, время: 09:05. |