本文將介紹使用JS倒計時獲取服務(wù)器時間,精準(zhǔn)掌握時間并實時更新倒計時的方法。
1、獲取服務(wù)器時間
在前端頁面中,我們常常需要獲取服務(wù)器時間來進行相關(guān)的計算。有一種常見的做法是使用AJAX技術(shù),通過向服務(wù)器發(fā)送請求獲取當(dāng)前時間。但是,這種方法可能存在一些問題,比如網(wǎng)絡(luò)延遲導(dǎo)致的時間誤差。另外,如果用戶頻繁刷新頁面,也會給服務(wù)器帶來不必要的壓力。
另一種更加穩(wěn)妥的方法是,在服務(wù)器端生成一個時間戳,并將其存儲在前端頁面中。當(dāng)頁面加載時,JS腳本通過讀取這個時間戳獲取服務(wù)器時間。這種方法可以避免網(wǎng)絡(luò)延遲導(dǎo)致的誤差,并且不會對服務(wù)器造成額外的壓力。
我們可以使用PHP來生成時間戳,并在前端頁面中使用JS讀?。?/p>
<?php$time = time();
echo "<script>var serverTime={$time};</script>";
?>
var serverTime = new Date(serverTime * 1000);
2、倒計時實現(xiàn)
倒計時是JS應(yīng)用的常見場景之一。在前端頁面中,我們通常會設(shè)置一個截止時間點,并根據(jù)當(dāng)前時間與截止時間點之間的時間差來實現(xiàn)倒計時。可以用以下代碼實現(xiàn):
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)); // 設(shè)置截止時間
<div id="days"></div>天<div id="hours"></div>小時<div id="minutes"></div>分鐘<div id="seconds"></div>秒
3、精確掌握時間
在前面的例子中,我們已經(jīng)通過服務(wù)器時間獲取了準(zhǔn)確的當(dāng)前時間。但是,JS本身也可以提供一些API來獲取更加精確的時間。
使用window.performance.timing來獲取加載時間:
var performanceTiming = window.performance.timing;var pageLoadTime = performanceTiming.loadEventEnd - performanceTiming.navigationStart;
使用Date.now()來獲取當(dāng)前時間的時間戳:
var timestamp = Date.now();
使用requestAnimationFrame()來獲取更加精確的時間,并避免setTimeout()和setInterval()的觸發(fā)時間誤差:
var lastTimestamp;function loop(timestamp) {
if (!lastTimestamp) {
lastTimestamp = timestamp;
}
var elapsedTime = timestamp - lastTimestamp;
// 在這里做一些具體的操作
lastTimestamp = timestamp;
requestAnimationFrame(loop);
requestAnimationFrame(loop);
4、實時更新倒計時
在前面的例子中,我們使用了setTimeout()來定時更新倒計時。但是,這種方法存在一些問題,比如setTimeout()在后臺標(biāo)簽頁中運行的速度可能會減慢。更好的方法是使用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)); // 設(shè)置截止時間
總的來說,JS倒計時獲取服務(wù)器時間是一個非常常見的場景,掌握了這個技能可以幫助我們更好的控制時間,并為用戶提供更加友好的交互體驗。
山河電子因為專業(yè)所以無懼任何挑戰(zhàn)
北京山河錦繡科技開發(fā)中心,簡稱:山河電子經(jīng)驗專注于PNT行業(yè)領(lǐng)域技術(shù),專業(yè)從事授時web管理開發(fā)、信創(chuàng)麒麟系統(tǒng)應(yīng)用、北斗時間頻率系統(tǒng)、金融PTP通用解決方案以及特需解決方案的指定,在授時領(lǐng)域起到領(lǐng)導(dǎo)者地位,在NTP/ptp方案集成和市場服務(wù)工作中面對多樣化和專業(yè)化的市場需求,山河電子致力于設(shè)計和開發(fā)滿足不同用戶真實需求的產(chǎn)品和解決方案,技術(shù)業(yè)務(wù)涉航空航天、衛(wèi)星導(dǎo)航、軍民通信及國防裝備等領(lǐng)域,為我國深空探測、反隱身雷達(dá)、授時中心銫鐘項目等國家重大工程建設(shè)提供了微波、時間頻率基準(zhǔn)及傳遞設(shè)備。