Для простоты, скажем, мне нужно создать страницу, которая постоянно обновляется и показывает, сколько рогаток, котят и крыс рождается в секунду. Как счетчик или таймер.
Я также должен показать, сколько щенков, котят и крыс родилось с 6 утра и с начала месяца.
Я не могу понять, как определить, сколько щенков, котят и крыс родилось с 6 утра и начиная со звезды месяца, используя Date(), и эта сумма постоянно обновляется.
HTML
<section id="s01">
<h1>if 3 puppies are born every second</h1>
<b id="badge01" class="now">0</b> puppies have been born so far.<br>
<b class="morning">?</b> puppies have been born since this 6 a.m. morning.<br>
<b class="month">?</b> puppies have been born since the first of this month.
</section>
<section id="s02">
<h1>if 5 kittens are born every second</h1>
<b id="badge02" class="now">0</b> kittens have been born so far.<br>
<b class="morning">?</b> kittens have been born since this 6 a.m. morning.<br>
<b class="month">?</b> kittens have been born since the first of this month.
</section>
<section id="s03">
<h1>if 7 rats are born every second</h1>
<b id="badge03" class="now">0</b> rats have been born so far.<br>
<b class="morning">?</b> rats have been born since this 6 a.m. morning.<br>
<b class="month">?</b> rats have been born since the first of this month.
</section>
JS
var now = new Date();
var dayOfMonth = now.getDate();
setInterval(function () {
// 3 puppies born every second
$('#badge01').html(parseInt($('#badge01').html()) + 3);
// 5 kittens born every second
$('#badge02').html(parseInt($('#badge02').html()) + 5);
// 7 rats born every second
$('#badge03').html(parseInt($('#badge03').html()) + 7);
}, 1);
Мой JSFiddle здесь - http://jsfiddle.net/gJy4x/6/ (Я новичок в JS, поэтому, пожалуйста, несите меня.)
Я начну с того, что найду время сейчас, в 6 утра и первое из месяца:
var start = new Date(),
sixAM = new Date(start.getFullYear(), start.getMonth(), start.getDate(), 6),
first = new Date(start.getFullYear(), start.getMonth(), 1);
то в вашем интервале цикла найдите секунды, прошедшие с тех пор:
var now = new Date(),
secondsFromStart = (now - start)/1000,
secondsFromSixAM = (now - sixAM)/1000,
secondsFromFirst = (now - first)/1000;
после этого вы можете просто нажать значения в html (используя Math.floor для округления).
См. Обновленную скрипту: http://jsfiddle.net/gJy4x/7/
Ну, во-первых, второй аргумент setInterval()
- в миллисекундах. Таким образом, вы хотите, чтобы это значение было 1000, а не 1.
Предполагая 5 котят каждую секунду (мне нравятся котята!).
Сколько котят рождается с 6 утра сегодня?
// Cache date object
var now = new Date();
// Give me milliseconds!
var six = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 6);
// Time now
var timeNow = now.getTime();
// Convert milliseconds to seconds
// Since it in floating point, we'll round it.
var difference = Math.round((timeNow - six) / 1000);
// Woot, kittens!
var totalKittens = difference * 5;
Сколько котят родилось с начала месяца?
Такая же идея! Вместо использования six
мы будем использовать:
var monthBegin = new Date(now.getFullYear(), now.getMonth());
Вы можете пропустить этот день. Подразумевается начало месяца. Откуда я знаю это?
В документах:
Если задано не менее двух аргументов, отсутствующие аргументы либо установлены в 1 (если дата отсутствует), либо 0 для всех остальных.
Вы должны узнать больше о объекте Date.
Чтобы получить секунды с 6 утра сегодня:
function secsSince6am() {
var now = new Date();
var earlier = new Date(+now);
earlier.setHours(6,0,0,0);
return Math.round((now - earlier)/1000);
}
Но это будет работать только после 6 утра. Если вы хотите время с 6 утра вчера для промежутка между полуночью и 6 утра, вы можете сделать:
function secsSince6am() {
var now = new Date();
var earlier = new Date(+now);
earlier.setHours(6,0,0,0);
var diff = Math.round((now - earlier)/1000);
return diff < 0? diff + 8.64e4 : diff;
}
Чтобы получить секунды с начала месяца:
function secsSinceStartOfMonth() {
var now = new Date();
var earlier = new Date(+now);
earlier.setDate(1);
earlier.setHours(0,0,0,0);
return Math.round((now - earlier)/1000);
}
new Date()
, он сначала преобразуется в строку, затем строка анализируется для создания объекта даты. IE ошибается в течение лет 0 - 99, предполагая, что это двузначные годы 20-го века. Использование +now
преобразует его в значение времени, которое везде используется правильно. Это может не иметь значения в этом случае, но иногда имеет значение. Добавление 8.64e4 только для периода от полуночи до 0600, чтобы вернуть секунды с 0600 предыдущего дня (если это необходимо). В противном случае используйте первую функцию и обработайте значения -ve от 0000 до 0600 другим способом. :-)