本文将介绍使用JS倒计时获取服务器时间,精准掌握时间并实时更新倒计时的方法。
1、获取服务器时间
在前端页面中,我们常常需要获取服务器时间来进行相关的计算。有一种常见的做法是使用AJAX技术,通过向服务器发送请求获取当前时间。但是,这种方法可能存在一些问题,比如网络延迟导致的时间误差。另外,如果用户频繁刷新页面,也会给服务器带来不必要的压力。
另一种更加稳妥的方法是,在服务器端生成一个时间戳,并将其存储在前端页面中。当页面加载时,JS脚本通过读取这个时间戳获取服务器时间。这种方法可以避免网络延迟导致的误差,并且不会对服务器造成额外的压力。
我们可以使用PHP来生成时间戳,并在前端页面中使用JS读取:
<?php$time = time();
echo "<script>var serverTime={$time};</script>";
?>
var serverTime = new Date(serverTime * 1000);
2、倒计时实现
倒计时是JS应用的常见场景之一。在前端页面中,我们通常会设置一个截止时间点,并根据当前时间与截止时间点之间的时间差来实现倒计时。可以用以下代码实现:
function countdown(endTime) { var remainingTime = new Date(endTime - serverTime);
// 计算剩余时间
var days = Math.floor(remainingTime / 1000 / 60 / 60 / 24),
hours = Math.floor((remainingTime / 1000 / 60 / 60) % 24),
minutes = Math.floor((remainingTime / 1000 / 60) % 60),
seconds = Math.floor((remainingTime / 1000) % 60);
// 更新倒计时
document.getElementById(days).innerHTML = days;
document.getElementById(hours).innerHTML = hours;
document.getElementById(minutes).innerHTML = minutes;
document.getElementById(seconds).innerHTML = seconds;
// 每隔1秒更新一次倒计时
setTimeout(function() {
countdown(endTime);
}, 1000);
countdown(new Date(2021/12/31)); // 设置截止时间
<div id="days"></div>天<div id="hours"></div>小时<div id="minutes"></div>分钟<div id="seconds"></div>秒
3、精确掌握时间
在前面的例子中,我们已经通过服务器时间获取了准确的当前时间。但是,JS本身也可以提供一些API来获取更加精确的时间。
使用window.performance.timing来获取加载时间:
var performanceTiming = window.performance.timing;var pageLoadTime = performanceTiming.loadEventEnd - performanceTiming.navigationStart;
使用Date.now()来获取当前时间的时间戳:
var timestamp = Date.now();
使用requestAnimationFrame()来获取更加精确的时间,并避免setTimeout()和setInterval()的触发时间误差:
var lastTimestamp;function loop(timestamp) {
if (!lastTimestamp) {
lastTimestamp = timestamp;
}
var elapsedTime = timestamp - lastTimestamp;
// 在这里做一些具体的操作
lastTimestamp = timestamp;
requestAnimationFrame(loop);
requestAnimationFrame(loop);
4、实时更新倒计时
在前面的例子中,我们使用了setTimeout()来定时更新倒计时。但是,这种方法存在一些问题,比如setTimeout()在后台标签页中运行的速度可能会减慢。更好的方法是使用requestAnimationFrame(),它可以保证在页面激活时按照60fps的速率运行。
这里我们将上面的倒计时例子进行改进:
var remainingTime = null;function countdown(endTime) {
if (!remainingTime) {
remainingTime = new Date(endTime - serverTime);
}
// 计算剩余时间
var days = Math.floor(remainingTime / 1000 / 60 / 60 / 24),
hours = Math.floor((remainingTime / 1000 / 60 / 60) % 24),
minutes = Math.floor((remainingTime / 1000 / 60) % 60),
seconds = Math.floor((remainingTime / 1000) % 60);
// 更新倒计时
document.getElementById(days).innerHTML = days;
document.getElementById(hours).innerHTML = hours;
document.getElementById(minutes).innerHTML = minutes;
document.getElementById(seconds).innerHTML = seconds;
// 实时更新倒计时
requestAnimationFrame(function() {
remainingTime = new Date(endTime - serverTime);
countdown(endTime);
});
countdown(new Date(2021/12/31)); // 设置截止时间
总的来说,JS倒计时获取服务器时间是一个非常常见的场景,掌握了这个技能可以帮助我们更好的控制时间,并为用户提供更加友好的交互体验。
山河电子因为专业所以无惧任何挑战
北京山河锦绣科技开发中心,简称:山河电子经验专注于PNT行业领域技术,专业从事授时web管理开发、信创麒麟系统应用、北斗时间频率系统、金融PTP通用解决方案以及特需解决方案的指定,在授时领域起到领导者地位,在NTP/ptp方案集成和市场服务工作中面对多样化和专业化的市场需求,山河电子致力于设计和开发满足不同用户真实需求的产品和解决方案,技术业务涉航空航天、卫星导航、军民通信及国防装备等领域,为我国深空探测、反隐身雷达、授时中心铯钟项目等国家重大工程建设提供了微波、时间频率基准及传递设备。