Разница между часами + тарифы
У меня такое дело, я работаю в анти-кафе. Тема такая: человек заходит мы ему даем карточку на которой час когда он к нам зашел. Когда выходит, мы соответственно смотрим на час и считаем сколько времени он у нас провел и умножаем количество минут на 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."; // это я щак нашел элемент,куда записывать строку (увы,лучше придумать не мог :D ) el.parentNode.children[4].innerHTML = str; } </script> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> </body> </html> Помогите пожалуйста. Заранее спс :) :) :) |
Ой да, время сорри :)))) Скажем 13:25
|
gevtiman, без даты никак, например, если зашел сегодня в 13:25, а вышел завтра в 13:25, то если не учитывать дату получается, что он вам ничего не должен :D
<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>
|
Rise,где - то на форуме есть вариант решения подобной задачи, делал но никак ненайду был простой цикл наращивания минут и прибавления к сумме -- если часы совпадали с отметкой в обьекте цена минуты менялась когда часы и минуты совпадали с текущими цикл останавливался выдавал результат -- из расчёта присутствия не более одних суток
|
|
Если совсем забить на производительность, то можно сделать что-то типо этого:
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);
|
| Часовой пояс GMT +3, время: 14:58. |