Пересчитать сумму за прошедшие время по тарифам
Привет, господа программисты!
Нуждаюсь в Вашей помощи, задался задачей, мне кажется довольно интересной и застрял. Идея такая: при открытие страницы(или при клике на кнопку, не суть, сам разберусь потом, главное механизм) у пользователя в локальную память сохраняется текущие время и он может даже уйти со страницы(или остаться наблюдать за пересчетом в реально времени, опять же потом сам повешу на таймаут, чтобы выводился пересчет в реальном времени), зайдя через некоторое время он должен получить сумму из расчета пройденного времени и тарифов. 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, время: 11:48. |