IвЂve создал Класс обслуживания в моей текущей company’s служебной библиотеке для этих видов проблем:
public class Service implements Runnable {
private boolean shouldStop = false;
public synchronized stop() {
shouldStop = true;
notify();
}
private synchronized shouldStop() {
return shouldStop;
}
public void run() {
setUp();
while (!shouldStop()) {
doStuff();
sleep(60 * 1000);
}
}
private synchronized sleep(long delay) {
try {
wait(delay);
} catch (InterruptedException ie1) {
/* ignore. */
}
}
}
, Конечно, это совсем не завершено, но необходимо получить суть. Это позволит Вам просто звонить stop()
метод, когда Вы захотите, чтобы программа остановилась, и это выйдет чисто.
Номер месяца в функции конструктора даты отсчитывается от нуля, вы должны вычесть единицу, и я думаю, что проще вычислить дельту с использованием метки времени:
function getDayDelta(incomingYear,incomingMonth,incomingDay){
var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay),
today = new Date(), delta;
// EDIT: Set time portion of date to 0:00:00.000
// to match time portion of 'incomingDate'
today.setHours(0);
today.setMinutes(0);
today.setSeconds(0);
today.setMilliseconds(0);
// Remove the time offset of the current date
today.setHours(0);
today.setMinutes(0);
delta = incomingDate - today;
return Math.round(delta / 1000 / 60 / 60/ 24);
}
getDayDelta(2008,8,18); // -365
getDayDelta(2009,8,18); // 0
getDayDelta(2009,9,18); // 31
Вы можете вызвать getTime () для каждого объекта даты, а затем вычесть позднее из более раннего. Это даст вам разницу в миллисекундах между двумя объектами. Отсюда легко перейти к дням.
Однако пара сбоев, на которые стоит обратить внимание: 1) переход на летнее время и 2) обеспечение того, чтобы ваше время приходилось из одного часового пояса.
Это будет работать лучше, но не работает с отрицательными значениями результата. Вы можете просто проанализировать значения самостоятельно и обработать их.
function getDayDelta(incomingYear,incomingMonth,incomingDay){
var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay);
var today = new Date();
today = new Date(Date.parse(today.format("yyyy/MM/dd")));
var delta = incomingDate - today;
if (delta == 0) { return 0; }
var resultDate = new Date(delta);
return resultDate.getDate();
}
//works for the future dates:
alert(getDayDelta(2009,9,10));
alert(getDayDelta(2009,8,19));
alert(getDayDelta(2009, 8, 18));