Часы на веб-странице, используя серверное и системное время?

Мне нужно добавить часы на веб-страницу. Часы должны быть синхронизированы с сервером, но я действительно не хочу, чтобы они постоянно проверяли сервер, так как страница будет открыта 24/7 на нескольких ПК. Есть ли какой-нибудь способ получить время с сервера, а затем использовать системные часы для его обновления и проверять сервер каждые 15 минут или около того, чтобы синхронизировать его?

8 ответов

Решение

То, как я пошел об этом раньше:

  • Потратьте время с сервера,
  • Потратьте время у клиента (немедленно)
  • Получить смещение.
  • При показе часов примените смещение к текущему времени на клиенте.

Вам нужно только обновить это время от времени с сервера.

Проблема, с которой вам нужно разобраться, заключается в том, что при отправке запроса на получение времени с сервера будет задержка, прежде чем вы сможете получить время клиента. Вероятно, вы можете минимизировать это, используя ajax-запрос, чтобы получить время сервера и ничего больше, тем самым сокращая накладные расходы, сетевые задержки и т. Д.

+Date.now() возвращает локальную мс с эпохи Unix. Так:

  • Получить время с сервера
  • Рассчитать разницу между временем сервера и местным временем
  • Обновляйте часы каждую секунду или минуту (в зависимости от того, что вы отображаете), получая местное время и регулируя его, используя разницу
  • Каждые 15 минут обновляйте разницу.

Или что-то типа того.

Вот скрипка, демонстрирующая первую половину:

var serverTime = 1310127993162; //this would come from the server obviously
var localTime = +Date.now();
var timeDiff = serverTime - localTime;

setInterval(function () {
    console.log(+Date.now() + timeDiff);
}, 1000); 
Server Time: <input type="text" id="clock" value="" size='8'>

<script type="text/javascript">
var serverTime = <?php echo time() * 1000; ?>; //this would come from the server
var localTime = +Date.now();
var timeDiff = serverTime - localTime;

setInterval(function () {
    var realtime = +Date.now() + timeDiff;
    var date = new Date(realtime);
    // hours part from the timestamp
    var hours = date.getHours();
    // minutes part from the timestamp
    var minutes = date.getMinutes();
    // seconds part from the timestamp
    var seconds = date.getSeconds();

    // will display time in 10:30:23 format
    var formattedTime = hours + ':' + minutes + ':' + seconds;

    $('#clock').attr('value',formattedTime); <-- input id=clock
}, 1000);
</script>

Одна идея состоит в том, чтобы ответить на дату и время на странице, когда это запрашивается. лайк:

<html>
your serveside codes,
<script>
var serverdatetime = new Date("<%=Datetime.Now%>");
//use serverdatetime and update it after 15 mins.

// you can use ajax to get datetime
setTimeout(function(){
    $.ajax({
  url: 'http://yourhost.com/getdate',
  success: function( data ) {
    // use data and update serverdatetime
  }
});},54000);
</script>
server codes

</html>

** примечание: это только идея, код может не работать

<script>
var ctoday = <?php echo time() * 1000 ?>;
setInterval(function() {ctoday += 1000;},1000);
function startTime() {
    var today = new Date(ctoday);
    var montharray = new Array("Jan","Feb","Mar","Abr","May","Jun","Jul","Ogu","Sep","Oct","Nov","Des");
    var h = today.getHours();
    var ampm = h >= 12 ? 'PM' : 'AM';
    h = h % 12;
    h = h ? h : 12;
    var m = today.getMinutes();
    var s = today.getSeconds();
    h = checkTime(h);
    m = checkTime(m);
    s = checkTime(s);
    document.getElementById('txt').innerHTML =
    checkTime(today.getDate())+" "+montharray[today.getMonth()]+" "+today.getFullYear() + " (" + ampm +" " + h + ":" + m + ":" + s +")"; 
    setTimeout(startTime, 1000);
}

function checkTime(i) {
    if (i < 10) {i = "0" + i};
    return i;
}
</script>
<body onLoad="startTime();">
    <span id="txt"></span>
</body>
  1. Создайте переменную, хранящую время сервера, используя PHP.
  2. Добавляет 1000 к отметке времени каждую 1 секунду (1000 = 1 секунда).
  3. Теперь получите часы.
  4. Теперь создайте новую дату с увеличенной отметкой времени.
  5. создает названия месяцев
  6. обнаружить AM или PM.
  7. преобразовать формат часов из 24 в 12
  8. Получение минут
  9. Получение секунд
  10. добавить 0 лидов, если часов меньше 10
  11. добавить 0 лидов, если минут меньше 10
  12. добавить 0 лидов, если секунд меньше 10
  13. Теперь объедините все время и дату и поместите их в элемент DOM с идентификатором "txt"
  14. повторяйте функцию каждые 1 сек
  15. Функция добавляет 0, чтобы привести числа < 10

Попробуйте ниже код это:

var m_serverDateTime;
var currentOffsetedTime;
var diffMilliseconds;

$(document).ready(function () {
   m_serverDateTime = getServerDateTime();/*your function to get server time 
by ajax call */   
diffMilliseconds = GetServerTimeDifference(m_serverDateTime);

});

 function GetServerTimeDifference(serverdatetime) {
  var fromdate = new Date();

  var todate = new Date(serverdatetime);

  var localdiffMilliseconds = todate - fromdate;

  return localdiffMilliseconds;
 }

setInterval(function () {
  //var currentOffsetedTime = new Date().setMinutes(diffMinutes);
  currentOffsetedTime = new Date();
  currentOffsetedTime.setMilliseconds(diffMilliseconds);

  $('#lblTimer').text(format(currentOffsetedTime, 'dd/MM/yyyy  HH:mm'));
}, 1000);

Вы можете получать текущее время с сервера при каждой загрузке страницы, поэтому даже при первой загрузке у вас будет текущее время сервера. После этого вы можете использовать таймер JavaScript на странице, установленной для отметки каждую секунду, и тогда у вас фактически будут часы, синхронизированные с сервером. Вы также можете попробовать применить смещения, как предложено, но я бы не советовал, так как есть задержки во время обратных передач.

Ajax-запрос может быть интересным вариантом.

Любые сомнения, вы также можете проверить эти часы!

Кроме того, W3Schools является отличным справочником по JavaScript.

Вы просто получаете одно время даты с сервера, при загрузке вызываете этот метод и используете моменты js для формата даты:

var timeMiliSecond = new Date(serverTime).getTime();
 callRepeatedly() {
    setTimeout(() => {
         timeMiliSecond = timeMiliSecond+1000;         
         serverTime=moment(newDate(timeMiliSecond)).format('MM-DD-YYYY HH:mm:ss');
         this.callRepeatedly();
      }, 1000)  
  }
Другие вопросы по тегам