使用 time() PHP 和 moment.js 倒计时
Countdown with time() PHP and moment.js
我根据加起来为五分钟的当前时间戳的结果编写了倒计时代码,但我无法让脚本显示从该时间戳开始的倒计时。代码完成:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="//cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" />
<title>Hello, world!</title>
<script src="//code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script type="text/javascript">
var duration = moment.duration(1646486515 * 1000, 'milliseconds');
var interval = 1000;
setInterval(function(){
duration = moment.duration(duration.asMilliseconds() - interval, 'milliseconds');
$('#time').text(moment(duration.asMilliseconds()).format('h:mm:ss'));
if(duration.asSeconds() <=0) {
window.location.replace(window.location.pathname + window.location.search + window.location.hash);
}
}, interval);
</script>
</head>
<body>
<center><p><h1>Hello, world!</h1></p></center>
<div class="container mb-2 my-2">
<div class="p-3 shadow-sm">
result of code: <span id="time" class="countdown">--:--</span>
<?php
echo '<br />NOW:'.time().'<br>+5 minutes: '.time()+300;
?>
<br />
What i want is: 00:04:59
</div>
</div>
</body>
</html>
结果:
https://i.stack.imgur.com/oNBND.png
如果您给出“+5 分钟”,即 time() 函数的总和 + 300 秒(5 分钟),例如,您将得到现在的日期 + 未来的 5 分钟,但在时间戳中.这里的目的是脚本计数 00:05:00 现在开始 time()。
仔细看这一行:
var duration = moment.duration(1646486515 * 1000, 'milliseconds');
1646486515秒有多少分钟?远远超过五个!事实上,它已经超过 52 年 ,但是当您格式化它时,您不会显示年、月和日,只显示剩余的小时、分钟和秒。
这是因为 time()
返回给您 时间点 的表示,基于自 1970 年 1 月 1 日午夜 UTC 以来经过的秒数。
为了得到那个时间点和另一个时间点之间的持续时间,你需要比较它们。最简单的方法是从一个中减去另一个。例如,1646486815 - 1646486515
给你 300
,表示这两个时间点之间的持续时间为 300 秒。
在你的例子中,你知道持续时间是 300 秒,所以可以这样写:
var duration = moment.duration(300 * 1000, 'milliseconds');
或者更简单地说:
var duration = moment.duration(300, 'seconds');
第二个问题在这一行:
$('#time').text(moment(duration.asMilliseconds()).format('h:mm:ss'));
在这里,我们取一个duration,并用它来创建一个“时刻”,即一个特定的时间点;但是什么时间点,为什么?我们真正想要的是格式化它,因为持续时间类型没有format
方法,但是它有获取小时、分钟和秒的方法,所以我们可以自己写:
var duration = moment.duration(300, 'seconds');
formattedDuration = duration.hours() + ':' + String(duration.minutes()).padStart(2, '0') + ':' + String(duration.seconds()).padStart(2, '0');
$('#time').text(formattedDuration);
这里的关键是依次查看每个部分,在我们开始工作之前不要试图将各个部分组合在一起。一旦我们知道我们可以根据秒数创建一个持续时间,并格式化该持续时间,我们就可以添加 PHP 来决定从多少秒开始。一旦我们完成了这项工作,我们就可以添加对持续时间进行倒计时的部分,然后添加在它达到零时执行额外操作的部分。
我最终用另一个想法解决了我的问题。也许如果您正在寻找答案,这会对您有所帮助。
首先,如果您使用 PHP 的函数“time()”加上 + 5 分钟,请使用此函数转换为日期时间字符串:
date('Y-m-d H:m:s', $row['time_stamp'])
有了这个,结果是一个格式化的日期:2022-03-05 12:00:00(已经包含 5 分钟)。
然后,从这里下载脚本:http://hilios.github.io/jQuery.countdown/documentation.html安装后,使用文档脚本并定义时区。
代码最终代码为:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="//cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" />
<title>Hello, world!</title>
<script src="//code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdn.rawgit.com/mckamey/countdownjs/master/countdown.min.js"></script>
<script src="https://momentjs.com/downloads/moment-timezone.js"></script>
<script type="text/javascript">
var timesZone = moment.tz("<?php echo date('Y-m-d H:i:s',$get['time_zone']); ?>","America/Sao_Paulo");
$("#timer").countdown(timesZone.toDate(), function(event) {
$(this).text(event.strftime('%H:%M:%S'));
});
</script>
</head>
<body>
<center><p><h1>Hello, world!</h1></p></center>
<div class="container mb-2 my-2">
<div class="p-3 shadow-sm">
result of code: <span id="timer" class="countdown">--:--</span>
<?php
$newTime = time()+300;
echo '<br />NOW:'.time().'<br>+5 minutes: '.$newTime.'<br />New time date: '. date('Y-m-d H:s:i',time());
?>
<br />
What i want is: 00:04:59
</div>
</div>
</body>
</html>
我根据加起来为五分钟的当前时间戳的结果编写了倒计时代码,但我无法让脚本显示从该时间戳开始的倒计时。代码完成:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="//cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" />
<title>Hello, world!</title>
<script src="//code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script type="text/javascript">
var duration = moment.duration(1646486515 * 1000, 'milliseconds');
var interval = 1000;
setInterval(function(){
duration = moment.duration(duration.asMilliseconds() - interval, 'milliseconds');
$('#time').text(moment(duration.asMilliseconds()).format('h:mm:ss'));
if(duration.asSeconds() <=0) {
window.location.replace(window.location.pathname + window.location.search + window.location.hash);
}
}, interval);
</script>
</head>
<body>
<center><p><h1>Hello, world!</h1></p></center>
<div class="container mb-2 my-2">
<div class="p-3 shadow-sm">
result of code: <span id="time" class="countdown">--:--</span>
<?php
echo '<br />NOW:'.time().'<br>+5 minutes: '.time()+300;
?>
<br />
What i want is: 00:04:59
</div>
</div>
</body>
</html>
结果: https://i.stack.imgur.com/oNBND.png
如果您给出“+5 分钟”,即 time() 函数的总和 + 300 秒(5 分钟),例如,您将得到现在的日期 + 未来的 5 分钟,但在时间戳中.这里的目的是脚本计数 00:05:00 现在开始 time()。
仔细看这一行:
var duration = moment.duration(1646486515 * 1000, 'milliseconds');
1646486515秒有多少分钟?远远超过五个!事实上,它已经超过 52 年 ,但是当您格式化它时,您不会显示年、月和日,只显示剩余的小时、分钟和秒。
这是因为 time()
返回给您 时间点 的表示,基于自 1970 年 1 月 1 日午夜 UTC 以来经过的秒数。
为了得到那个时间点和另一个时间点之间的持续时间,你需要比较它们。最简单的方法是从一个中减去另一个。例如,1646486815 - 1646486515
给你 300
,表示这两个时间点之间的持续时间为 300 秒。
在你的例子中,你知道持续时间是 300 秒,所以可以这样写:
var duration = moment.duration(300 * 1000, 'milliseconds');
或者更简单地说:
var duration = moment.duration(300, 'seconds');
第二个问题在这一行:
$('#time').text(moment(duration.asMilliseconds()).format('h:mm:ss'));
在这里,我们取一个duration,并用它来创建一个“时刻”,即一个特定的时间点;但是什么时间点,为什么?我们真正想要的是格式化它,因为持续时间类型没有format
方法,但是它有获取小时、分钟和秒的方法,所以我们可以自己写:
var duration = moment.duration(300, 'seconds');
formattedDuration = duration.hours() + ':' + String(duration.minutes()).padStart(2, '0') + ':' + String(duration.seconds()).padStart(2, '0');
$('#time').text(formattedDuration);
这里的关键是依次查看每个部分,在我们开始工作之前不要试图将各个部分组合在一起。一旦我们知道我们可以根据秒数创建一个持续时间,并格式化该持续时间,我们就可以添加 PHP 来决定从多少秒开始。一旦我们完成了这项工作,我们就可以添加对持续时间进行倒计时的部分,然后添加在它达到零时执行额外操作的部分。
我最终用另一个想法解决了我的问题。也许如果您正在寻找答案,这会对您有所帮助。
首先,如果您使用 PHP 的函数“time()”加上 + 5 分钟,请使用此函数转换为日期时间字符串:
date('Y-m-d H:m:s', $row['time_stamp'])
有了这个,结果是一个格式化的日期:2022-03-05 12:00:00(已经包含 5 分钟)。
然后,从这里下载脚本:http://hilios.github.io/jQuery.countdown/documentation.html安装后,使用文档脚本并定义时区。
代码最终代码为:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="//cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" />
<title>Hello, world!</title>
<script src="//code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdn.rawgit.com/mckamey/countdownjs/master/countdown.min.js"></script>
<script src="https://momentjs.com/downloads/moment-timezone.js"></script>
<script type="text/javascript">
var timesZone = moment.tz("<?php echo date('Y-m-d H:i:s',$get['time_zone']); ?>","America/Sao_Paulo");
$("#timer").countdown(timesZone.toDate(), function(event) {
$(this).text(event.strftime('%H:%M:%S'));
});
</script>
</head>
<body>
<center><p><h1>Hello, world!</h1></p></center>
<div class="container mb-2 my-2">
<div class="p-3 shadow-sm">
result of code: <span id="timer" class="countdown">--:--</span>
<?php
$newTime = time()+300;
echo '<br />NOW:'.time().'<br>+5 minutes: '.$newTime.'<br />New time date: '. date('Y-m-d H:s:i',time());
?>
<br />
What i want is: 00:04:59
</div>
</div>
</body>
</html>