Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.10.2013, 12:54
Интересующийся
Отправить личное сообщение для Spamol Посмотреть профиль Найти все сообщения от Spamol
 
Регистрация: 19.03.2010
Сообщений: 27

Пересчитать сумму за прошедшие время по тарифам
Привет, господа программисты!
Нуждаюсь в Вашей помощи, задался задачей, мне кажется довольно интересной и застрял.
Идея такая: при открытие страницы(или при клике на кнопку, не суть, сам разберусь потом, главное механизм) у пользователя в локальную память сохраняется текущие время и он может даже уйти со страницы(или остаться наблюдать за пересчетом в реально времени, опять же потом сам повешу на таймаут, чтобы выводился пересчет в реальном времени), зайдя через некоторое время он должен получить сумму из расчета пройденного времени и тарифов.
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, 30.10.2013 в 12:57.
Ответить с цитированием
  #2 (permalink)  
Старый 30.10.2013, 14:57
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

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]) )

Последний раз редактировалось рони, 01.11.2013 в 11:37.
Ответить с цитированием
  #3 (permalink)  
Старый 30.10.2013, 15:25
Интересующийся
Отправить личное сообщение для Spamol Посмотреть профиль Найти все сообщения от Spamol
 
Регистрация: 19.03.2010
Сообщений: 27

рони,
Спасибо, интересный вариант.
Ответить с цитированием
  #4 (permalink)  
Старый 01.11.2013, 11:23
Интересующийся
Отправить личное сообщение для Spamol Посмотреть профиль Найти все сообщения от Spamol
 
Регистрация: 19.03.2010
Сообщений: 27

Хотя косяк, в пределах одного часа получаются отрицательные числа
http://jsbin.com/IYaROfo/1/edit?js,output
Ответить с цитированием
  #5 (permalink)  
Старый 01.11.2013, 11:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

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);
Ответить с цитированием
  #6 (permalink)  
Старый 01.11.2013, 17:12
Интересующийся
Отправить личное сообщение для Spamol Посмотреть профиль Найти все сообщения от Spamol
 
Регистрация: 19.03.2010
Сообщений: 27

Спасибо, чет пытаюсь вкурить какой день, как Ваш скрипт работает, вроде объекты вижу, массивы вижу, циклы и условия понимаю, но как Вы так все это закрутили виртуозно, никак не могу разобрать по полочкам)
Но главное все работает!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Position fixed, но динамический по оси ОХ tvixa Элементы интерфейса 4 09.09.2013 15:39