Как я могу записать сценарий для обнаружения, когда пользователь изменяет их системное время в JS?
Нет (переносимого) способа отслеживать переменную в JavaScript. Кроме того, информация о дате не содержится в DOM, поэтому вы не получаете возможность запуска события DOM.
Лучшее, что вы можете сделать, - это использовать setInterval
для периодической проверки (каждую секунду?). Пример :
function timeChanged(delta) {
// Whatever
}
setInterval(function timeChecker() {
var oldTime = timeChecker.oldTime || new Date(),
newTime = new Date(),
timeDiff = newTime - oldTime;
timeChecker.oldTime = newTime;
if (Math.abs(timeDiff) >= 5000) { // Five second leniency
timeChanged(timeDiff);
}
}, 500);
Вы можете проверять каждые 30 секунд и т. Д. Если новое время отключено более чем на 30 секунд +/- некоторый порог, вы можете провести более исчерпывающее сравнение, чтобы определить, насколько он был изменен.
Вы имеете в виду, что они меняют свое системное время на что-то неправильное? Вы можете спросить пользователя об их часовом поясе и получить правильное время с сервера, а затем сравнить его с системным временем пользователя.
var last_time = new Date().getTime();
setInterval(function() {
var time = new Date().getTime();
var offset = time - last_time;
if(offset < 0 || offset > 1500) {
// Time has been changed
}
last_time = time;
}, 1000);
Теоретически это должно сработать. Он будет проверять каждую секунду, чтобы убедиться, что время не было изменено. Обратите внимание, что я использую 1100 миллисекунд, поскольку большинство интерпретаторов JS не запускают события точно в указанное время.
Надеюсь, это поможет!
Проверьте функцию интервала, чтобы время не изменилось слишком сильно:
function getTime() {
var d = new Date();
return d.getTime();
}
function checkTime() {
if (Math.abs(getTime() - oldtime) > 2000) { // Changed by more than 2 seconds?
alert("You changed the time!");
}
oldtime = getTime();
}
var oldtime = getTime();
setInterval(checkTime, 1000); // Check every second that the time is not off
Протестировано в Windows с Opera и FF и работает безупречно.
Не думаю, что есть решение того, о чем вы просите, но вы можете получить смещение часового пояса пользователя.
new Date().getTimezoneOffset() * -1
Возвращает смещение в минутах от GMT. Не забывайте, что при этом не учитывается летнее время.