Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.12.2014, 16:30
Новичок на форуме
Отправить личное сообщение для gevtiman Посмотреть профиль Найти все сообщения от gevtiman
 
Регистрация: 21.12.2014
Сообщений: 2

Разница между часами + тарифы
У меня такое дело, я работаю в анти-кафе. Тема такая: человек заходит мы ему даем карточку на которой час когда он к нам зашел. Когда выходит, мы соответственно смотрим на час и считаем сколько времени он у нас провел и умножаем количество минут на 10 (с 02:00 до 18:00) и на 17 (с 18:00 - 02:00).

Я хочу это автоматизировать. Чтобы вбивать только час когда человек зашел а код брал время автомат, вычеслял количество минут и умножал на соответствующий тариф.

Раньше на этом форуме находил что-то похожее (считывает сколько минут прошло после ДАТЫ, а мне нужно с часа) но не смог адаптировать под свои нужды.

<!DOCTYPE html>
<html>
Enter date - <b>m-m-dy</b> <br>
<input type = "date" value="2014-12-21" onclick="do_it(this)">
<br>
Action <b>Nothing yet</b>
<script>
// кэш
reg = /\d{4}-\d{2}-\d{2}/;
k = 1/(1000*60*60) ;

function do_it(el){
/*проверка на соответствие шаблону*/
if ( !reg.test(el.value) ) {alert('err');return}
var now = new Date(); // текущее время
var fut = Date.parse( el.value ); // введенное время
var delta = fut - now; // разница во времени ( в миллисекундах)
var back = delta < 0; // TRUE, если время уже прошло. FALSE, если оно еще не наступило
// т.к. в delta может быть и отрицательное число, то берем модуль, делим на 1000 и на 3600 ( после 1000 получаются секунды,после 3600 - часы) и потом округляем до двух знаков после запятой

var d = (Math.abs(delta)*k).toFixed(2);

// тут формирование строки. в d у нас количество часов

var str = '';
if( back) str = " was " + d + " hours ago";
else str = " will be in" + d + " hours.";
// это я щак нашел элемент,куда записывать строку (увы,лучше придумать не мог )
el.parentNode.children[4].innerHTML = str;
}
</script>

<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
</body>
</html>


Помогите пожалуйста. Заранее спс
Ответить с цитированием
  #2 (permalink)  
Старый 21.12.2014, 17:06
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

gevtiman, что значит час когда он к нам зашел минуты не учитываете что-ли? Может время когда зашел, а не час? Пример приведи что вы пишите на карточке.
Ответить с цитированием
  #3 (permalink)  
Старый 21.12.2014, 18:10
Новичок на форуме
Отправить личное сообщение для gevtiman Посмотреть профиль Найти все сообщения от gevtiman
 
Регистрация: 21.12.2014
Сообщений: 2

Ой да, время сорри ))) Скажем 13:25
Ответить с цитированием
  #4 (permalink)  
Старый 22.12.2014, 10:35
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

gevtiman, без даты никак, например, если зашел сегодня в 13:25, а вышел завтра в 13:25, то если не учитывать дату получается, что он вам ничего не должен
<form name="c">
	<input type="text" name="d"> ДД-ММ-ГГГГ<br>
	<input type="text" name="t"> ЧЧ-ММ<br>
	<input type="submit" value="Кнопка">
	<input type="text" name="p" readonly> руб.
</form>
<script>
document.c.onsubmit = function() {
	var p = (this.d.value + '-' + this.t.value).match(/^(\d{2})-(\d{2})-(\d{4})-(\d{2})-(\d{2})$/);
	if (!p) {
		this.p.value = 'Invalid format';
		return false;
	}
	var f = new Date(+p[3], p[2]-1, +p[1], +p[4], +p[5]);
	var d = new Date() - f;
	if (d < 6e4) {
		this.p.value = 'Date >= Date now';
		return false;
	}
	var x = {
		18: { m: 0, t: 10}, // 2-18
		2: { m: 0, t: 17} // 18-2
	};
	var y = 0;
	var h = f.getHours();
	while (1) {
		if (h > 17) {
			y = +f - f.setHours(26,0,0,0);
		} else if (h > 1) {
			y = +f - f.setHours(18,0,0,0);
		} else {
			y = +f - f.setHours(2,0,0,0);
		}
		h = f.getHours();
		if (y > 0) {
			x[h].m += y;
			d -= y;
		} else {
			if ((d + y) > 0) {
				x[h].m -= y;
				d += y;
			} else {
				x[h].m += d;
				break;
			}
		}
	}
	var s = 0;
	for (var k in x) {
		if (x[k].m) {
			s += parseInt(x[k].m / 6e4) * x[k].t;
		}
	}
	this.p.value = s;
	return false;
};
</script>
Ответить с цитированием
  #5 (permalink)  
Старый 22.12.2014, 14:14
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Интересно, как еще можно реализовать? Кто что предложит с удовольствием бы посмотрел) или мой подход единственно верный) Опустим ввод, валидация и вывод, интересен сам алгоритм.

Последний раз редактировалось Rise, 22.12.2014 в 14:22.
Ответить с цитированием
  #6 (permalink)  
Старый 22.12.2014, 15:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Rise,где - то на форуме есть вариант решения подобной задачи, делал но никак ненайду был простой цикл наращивания минут и прибавления к сумме -- если часы совпадали с отметкой в обьекте цена минуты менялась когда часы и минуты совпадали с текущими цикл останавливался выдавал результат -- из расчёта присутствия не более одних суток

Последний раз редактировалось рони, 22.12.2014 в 15:09.
Ответить с цитированием
  #7 (permalink)  
Старый 22.12.2014, 15:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Rise,
таки нашёл )))
Пересчитать сумму за прошедшие время по тарифам
Ответить с цитированием
  #8 (permalink)  
Старый 22.12.2014, 15:41
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Если совсем забить на производительность, то можно сделать что-то типо этого:
var startDate = new Date(2014,11,22,20,18);
var endDate = new Date(2014,11,23,3,18);

var prices = {
  '2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17': 10,
  '18,19,20,21,22,23,0,1': 17
};

var hoursPrices = {};
for(var key in prices) {
  var hours = key.split(',');
  hours.forEach(function(hour) {
    hoursPrices[hour] = prices[key];
  });
}

var minsCount = {},
    start = +startDate,
    end = +endDate;
for(var i = start; i < end; i += 60000) {
  var date = new Date(i);
  var hour = date.getHours();
  var price = hoursPrices[hour];
  if (!minsCount[price]) {
    minsCount[price] = 1;
  } else {
    minsCount[price] += 1;
  }
}

var sum = 0;
for(var price in minsCount) {
  sum += minsCount[price] * price;
}

alert(sum);
Ответить с цитированием
  #9 (permalink)  
Старый 23.12.2014, 14:47
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

рони, jsnb, изучаю)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разница между my_id и document.getElementById('my_id') js_explorer Events/DOM/Window 6 03.04.2013 17:53
Какая разница между модулями DOM Level 2 и интерфейсами Node? dump Общие вопросы Javascript 3 09.08.2012 17:22
Какая разница между post запросами jquery и ajax? Rooner jQuery 2 18.06.2012 14:29
Какая разница между определениями функций Nadine Общие вопросы Javascript 1 07.03.2012 16:07
Разница между (function(){})() и (function(){}()) ruzzx Общие вопросы Javascript 6 17.04.2011 22:51