Javascript nodejs中的倒计时计时器

Javascript nodejs中的倒计时计时器,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我正在为学生创建一个网站,该网站将用于分配考试,我的计时器有问题。我正在使用的一个是用javascript在前端制作的,每当刷新页面时,计时器就会启动。试图通过转换为epoch和back-to-datetime来存储开始和结束日期,但我想不出一种方法来将计时器移到前端并开始计数。其想法是计数60分钟,并调用提交按钮,以及显示倒计时,而不选择重新启动计数器 这就是我在nodejs中存储开始和结束时间的方式 var myDate = new Date(); var startTimeEpoch =

我正在为学生创建一个网站,该网站将用于分配考试,我的计时器有问题。我正在使用的一个是用javascript在前端制作的,每当刷新页面时,计时器就会启动。试图通过转换为epoch和back-to-datetime来存储开始和结束日期,但我想不出一种方法来将计时器移到前端并开始计数。其想法是计数60分钟,并调用提交按钮,以及显示倒计时,而不选择重新启动计数器

这就是我在nodejs中存储开始和结束时间的方式

var myDate = new Date();
var startTimeEpoch = myDate.getTime()/1000.0;
var endTimeEpoch = startTimeEpoch + 5400 // Adding 90 minutes to the timer
var startTimeBackToDate = new Date(startTimeEpoch *1000)
var endTimeBackToDate = new Date(endTimeEpoch *1000)
这是我正在使用的javascript计时器,我想知道我是否应该首先使用它

    function startTimer(duration, display) {
        var start = Date.now(),
            diff,
            minutes,
            seconds;
        function timer() {
            diff = duration - (((Date.now() - start) / 1000) | 0);
    
            minutes = (diff / 60) | 0;
            seconds = (diff % 60) | 0;
    
            minutes = minutes < 10 ? "0" + minutes : minutes;
            seconds = seconds < 10 ? "0" + seconds : seconds;
    
            display.textContent = minutes + ":" + seconds; 
    
            if (diff <= 0) {
                start = Date.now() + 1000;
            }
        }
        timer();
        setInterval(timer, 1000);
    }
    
    window.onload = function () {
        var fiveMinutes = "<%= scenario.time %>" * 60,
            display = document.querySelector('#time');
        startTimer(fiveMinutes, display);
    }
功能启动定时器(持续时间,显示){
var start=Date.now(),
差异,
会议记录,
秒;
函数计时器(){
diff=持续时间-((Date.now()-start)/1000)| 0);
分钟=(差异/60)| 0;
秒=(差异%60)| 0;
分钟=分钟<10?“0”+分钟:分钟;
秒=秒<10?“0”+秒:秒;
display.textContent=分钟+“:”+秒;

如果(diff我不认为有Javascript知识的学生可以修改的计时器应该用于严肃的测试,但是对于任何更轻松的测试,它应该是好的


我能想到的最好的系统是将测试长度存储在mongodb中,当登录用户开始测试时,记录该用户的当前时间。这样,您可以使用
user.testStart+test.length-Date.now()计算剩余时间

作为一个一般性的回答,在提供额外信息的情况下,我可以提出一个解决方案来实现这一点

如果您的学生都有特定的考试实体,当他们注册/开始考试时,您可以检索此考试的开始日期(添加mongo createdAt日期字段)并将其用作开始日期。 如果每次考试都有时间限制,那么你可以简单地计算一下,知道还剩多少时间。如下所示:

const getExamRemainingTime=(考试)=>{
//假设start是一个js日期对象
//timeLimit是一个代表考试时长的数字
const{start,timeLimit}=考试;
let end=(start.getHours()+timeLimit);
结束=结束。设定小时数(结束);
常量剩余时间=(+结束)-(+开始)
如果(剩余时间>0){
//持续时间未结束,考试仍在进行中
返回新日期(剩余时间);
}否则{
//考试结束了
返回0;
}
}
然后,在前端,如果它是纯javascript,则需要刷新计时器组件,在last Resort中使用setInterval,因为它对性能影响很大,并按照您希望的方式格式化日期


参考:将js Date对象转换为timestamp-。

谢谢你的回答,我想知道我是否应该以某种方式使用setInterval()在nodejs而不是javascript中创建计时器,你有什么建议吗?@7h3blu3我不明白你为什么需要“计时器”在node中,您知道Javascript中的setInterval函数的基础是每隔一个时间间隔执行一个函数,您为什么要这样做?您好,我的想法是使用setInterval可以向用户显示计时器,但没有太多经验,只是觉得在前端使用它是错误的。我在显示计时器时遇到了困难,从这里我可以我对是否应该使用JS或Nodejs感到困惑。我愿意接受建议。@7h3blu3您的前端使用什么?任何类型的javascript框架,或者此服务器端是否呈现?我没有使用任何框架作为计时器,它是纯javascript。但是,我将Nodejs与express和ejs一起用于我的页面(不确定此信息是否有用)。感谢您的详细建议!我一定会尝试使用此示例并远离setInterval,我现在可能只向用户显示endTime,以避免性能受到影响。