为什么我的计时器不会每三天动态重置一次?



我想知道我在代码逻辑中做错了什么,我试图每三天重置一次计时器。 在下面的代码中,我将计时器设置为2019年9月1日到期,也就是三天后。

我希望它自行重置为 2019 年 9 月 4 日,然后是 2019 年 9 月 7 日,依此类推。

我做错了什么,我该如何纠正? 下面还提供了JSFiddle。

https://jsfiddle.net/des6gjqa/

<!DOCTYPE HTML>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
p {
text-align: center;
font-size: 60px;
margin-top: 0;
}
</style>
</head>
<body>
<p id="demo"></p>
<script>
// Set the date we're counting down to
var countDownDate = new Date("Sep 1, 2019 9:45:00").getTime();
while(countDownDate.valueOf() < Date.now()) {
countDownDate = new Date(countDownDate.valueOf() + (3 * 24 * 60 * 1000)); // add 3 days to the start date
}
// Update the count down every 1 second
var x = setInterval(function() {
// Get today's date and time
var now = new Date().getTime();
// Find the distance between now and the count down date
var distance = countDownDate - now;
// Time calculations for days, hours, minutes and seconds
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
// Output the result in an element with id="demo"
document.getElementById("demo").innerHTML = days + "d " + hours + "h "
+ minutes + "m " + seconds + "s ";
// If the count down is over, write some text
if (distance < 0) {
clearInterval(x);
document.getElementById("demo").innerHTML = "EXPIRED";
}
if(countDownDate.valueOf() <= Date.now()) {
countDownDate = new Date(countDownDate.valueOf() + (3 * 24 * 60 * 1000));
}
}, 1000);
</script>
</body>
</html>

你的问题没有你想象的那么复杂。请考虑以下事项:

  • JavaScript 是一种客户端语言(在本例中(
  • 浏览器数据(本地存储,缓存等(可以很容易地操作。
  • JavaScript 执行在页面关闭时停止。

因此,每三天重置一次计时器的唯一方法是在三天内不关闭窗口。因为当您关闭它并再次访问该站点时,计时器将从 0 开始。

你应该怎么做?

最好的方法是在服务器上运行一些东西。(即.PHP Node.js,Python,Java等( 然后,您应该使用一种方法来识别用户的计算机,例如 IP 地址、自定义令牌(生成的服务器端(等。

这样,您可以使用会话 ID 为访问您网站的用户分配一个 cookie,并将开始日期保存在数据库中。通过这样做,您可以随时轻松地将实际日期与开始日期进行比较,然后如果失效大于 3 天,则显示 EXPIRE。

因为否则,您提供的脚本将在每次加载时开始计数 3 天。

请参阅 k3llydev 的答案以获得更强大的修复。如果您希望此代码是客户端的,并假设网页将在整个持续时间内打开,那么在这里我对jsfiddle进行了修改:https://jsfiddle.net/as57fjuL/。

从本质上讲,它只是在清除间隔并再次设置日期后重置"x"间隔。为简单起见,我手动将超时设置为大约 3 秒(可以通过删除行countDownDate = new Date(Date.now().valueOf() + 5000);来更改(。

你在表达式中错过了第二名: 而不是(3 * 24 * 60 * 1000(,您应该使用(3 * 24 * 60* 60 * 1000(

最新更新