基于实时时钟

Clock based in real time

本文关键字:实时时钟      更新时间:2023-09-26

我有一款ZORK风格的游戏,它有持续的警报和提示,并包括你需要持续的时间才能赢得它。

由于它有玩游戏的警报和提示,我无法使用设置的超时来运行时钟,所以我根据实时创建了一个时钟,但在使其工作时遇到了一些问题。

这是代码

var now = new Date();
var stS = now.getSeconds();
var stM = now.getMinutes();
var stH = now.getHours();

function getElapsedTime() {
setTimeout(function () {


var reS = now.getSeconds();
var reM = now.getMinutes();
var reH = now.getHours();
var elapS = reS - stS;
var elapM = reM - stM;
var elapH = reH - stH;
if (elapM < 0) {
    reM = reM + 60;
    elapM = reM - stM;
}
if (elapS < 0) {
    reS = reS + 60;
    elapS = reS - stS;
}

alert(elapS);
alert(elapM);
alert(elapH);
}, 10000);
}
getElapsedTime();

编辑:我在jsfiddle中运行它,但它返回警报,说没有时间过去,而它应该说已经过去了10秒。http://jsfiddle.net/t57wsrx8/

您使用的now与10秒前开始使用的相同。Date对象会保留给定的时间。它不会随着时间的推移而自动改变。您需要实例化一个新的now:

function getElapsedTime() {
    setTimeout(function () {
        var now = new Date();
        var reS = now.getSeconds();
        var reM = now.getMinutes();
        var reH = now.getHours();
        var elapS = reS - stS;
        var elapM = reM - stM;
        var elapH = reH - stH;
        if (elapM < 0) {
            reM = reM + 60;
            elapM = reM - stM;
        }
        if (elapS < 0) {
            reS = reS + 60;
            elapS = reS - stS;
        }
        alert(elapS);
        alert(elapM);
        alert(elapH);
    }, 10000);
}

请注意,如果将日期视为数字,则可以更清晰地计算时间跨度:

var start = +new Date();
function getElapsedTime() {
    setTimeout(function () {
        var elapsed = +new Date() - start;
        
        var elapS = Math.floor(elapsed /    1000) % 60;
        var elapM = Math.floor(elapsed /   60000) % 60;
        var elapH = Math.floor(elapsed / 3600000) % 24;
        alert(elapS);
        alert(elapM);
        alert(elapH);
    }, 10000);
}
getElapsedTime();