La meilleure façon de synchroniser javascript côté client de l'horloge avec un serveur de date
J'ai une tâche pour afficher l'horloge numérique (avec les minutes de précision) sur la page HTML dans certains fuseau horaire fixe (MSK ou MSD - en fonction de la date actuelle). J'aimerais éviter de compter sur le système client de l'horloge, de sorte que certains de la synchronisation avec le serveur est nécessaire. L'adresse HTTP du serveur envoie la Date d'en-tête dans chaque réponse afin que nous puissions envoyer une requête AJAX requête GET ou HEAD à n'importe quelle URL de notre site pour obtenir de serveur de date, de calculer la différence avec le client de la date et de l'utiliser lors de la mise à jour de l'horloge avec setTimeout().
Il y a d'autres questions reste: le fuseau horaire de commutation de la lumière du jour les paramètres, le temps de latence de la comptabilité pour les connexions lentes.
Toute idée de cette tâche la plus simple de la sorte? Je préfère le résoudre sans programmation côté serveur.
Vous devez vous connecter pour publier un commentaire.
vous devriez vous rappeler client de temps entre readyState==2 et readyState==3 si vous allez utiliser ajax, parce que le serveur de temps sera quelque part entre temps, sur demande, reçu et la réponse préparée
Ces deux fonctions Javascript devrait faire l'affaire pour vous.
EDIT: supprimé ".replace(/^(.)[\s\S]/,"$1")".
calcOffset() calcule le décalage de l'heure du serveur et compense GMT/UTC.
getServerTime() pour obtenir le décalage de l'heure locale de faire correspondre les serveurs à l'aide du fuseau horaire local.
Si calcOffset() prend du temps pour l'exécuter, vous pourriez perdre quelques secondes de précision. Peut-être le temps d'exécution peuvent être prises en compte....
Si vous êtes inquiet pour le calcul de l'offset de devenir mauvais quand l'heure locale ou l'heure du serveur de changement ou de l'heure d'été vous pourrait recalculer un peu après chaque heure d'horloge, le système permettra de compenser les changements dans la dayligt épargne-temps.
Il pourrait être nécessaire d'attendre jusqu'à ce que à la fois le local et le serveur d'horloge a passé l'heure.
L'exemple ne fonctionne que sous IE, en raison de "Msxml2.XMLHTTP" je pense que.....
.replace(/^(.*)[\s\S]*/,"$1")
?Date.parse(new Date().toUTCString());
crée un objet date, le convertit à l'UTC de la chaîne, analyse alors que de retour dans une date et renvoie le nombre de millisecondes depuis l'époque. Il peut être remplacé par le plus simple(new Date()).getTime();
ounew Date() * 1
Date.now()
Vous pouvez calculer l'heure exacte à NTP (Network Time Protocol) dans vos codes,
j'essaie d'expliquer pour vous:
X(SyncedTime) =
Now + (ServerClientDifferenceTimeWithRequestTime - RquestTime)
X(SyncedTime) =
Now + (ServerClientDifferenceTimeWithResponseTime - ResponseTime)
Now - ClientTime = RquestTime + ResponseTime
=>Now - (ServerClientDiffRq - RquestTime) = Now - (ServerClientDiffRs - ResponseTime)
si vous le résoudre, vous trouvé ceci:
ResponseTime = (ServerClientDifferenceTimeWithRequestTime - Now + ClientTime + - ServerClientDifferenceTimeWithResponseTime )/2
et puis vous pouvez trouver synchronisées temps ou le temps de serveur à client avec cette équation:
X(SyncedTime) =
Now + (ServerClientDifferenceTimeWithResponseTime - ResponseTime)
Je montre simple code, mais lorsque vous voulez écrire, il n'oublie pas utiliser UTC date & fonctions de temps...
Côté serveur (par exemple php, c#):
PHP:
C#:
Côté Client (Javascript avec Jquery):
json
. Si vous n'aimez pas le type coulée puis utilisezfloatval()
. Si l'horloge sur le navigateur est mauvaise, ce code ne fonctionne pas. Essayez, vous verrez. Pas "éteindre" de l'horloge, mais juste mis au mauvais moment. Le code de Aktau fonctionne.JSON
n'est PASJavascript
! Ils ont des règles différentes. J'ai aussi essayé avec une horloge qui était mauvais et qu'il n'a pas de travail - j'ai eu un temps qui était à mi-chemin entre l'horloge du client et du serveur d'horloge. Vous avez eu un TRÈS une bonne idée de faire ça! Mais il y a un bug quelque part.J'ai trouvé que l'algorithme de @mehdi-yeganeh ci-dessus ne m'a pas donné des résultats utiles, mais l'idée est bonne: pour utiliser le protocole NTP algorithme (ou au moins une version faible) afin de synchroniser le serveur et le client horloges.
C'est mon final de mise en œuvre, il utilise le serveur en-têtes de réponse, si disponible, pour plus de précision (corrigez-moi si je me trompe, mes propres tests disent que c'est tout à fait exact).
côté navigateur (javascript):
côté serveur (php, mais pourrait être n'importe quoi):
Votre serveur à l'itinéraire "GET /ntp' doit retourner quelque chose comme:
Si vous avez le PHP >5.4, ensuite, vous pouvez enregistrer un appel à microtime() et de le rendre un peu plus précis avec:
REMARQUE
De cette façon pourrait être vu comme une sorte de ghetto, il y a quelques autres Débordement de Pile réponses qui pourraient vous guider vers une meilleure solution:
$msec
et peut-être aussi des choses intéressantes peuvent être faites avec le$request_time
variable).Je voudrais seulement demander la mise à jour du serveur toutes les 30s ou alors, si vous avez besoin de précision uniquement à la minute. Ne comptez pas sur le client de temps, mais l'utilisation de leur système d'horloge à garder l'horloge précise entre les mises à jour. Je pense que vous avez répondu à votre propre question?
Il serait utile si nous avons mieux compris ce que vous êtes en train d'essayer de faire.
Si vous souhaitez simplement une horloge pour afficher l'heure sur le serveur, qui est ensuite ajusté à un certain horaire, le faire côté client avec des décalages. La poignée de l'heure d'été dans les fuseaux horaires, il est applicable à l'aide de la date à laquelle vous recevez à partir du serveur. Si vous voulez déterminer le temps de latence, vous auriez probablement besoin d'un petit script sur le serveur pour le calcul de la différence. Mais comme ci-dessus, il serait utile de mieux comprendre le problème. Si la précision est seulement à la minute, le temps de latence semble moins critique.
Grâce à @Mehdi Yeganeh et @Fedearne. - Je mettre en œuvre ma fonction à utiliser à la fois logique et c'est le travail.
https://gist.github.com/ethaizone/6abb1d437dbe406fbed6
Je voudrais synchroniser l'heure lors de l'initialisation avec un Serveur de Temps Internet.
http://tf.nist.gov/service/its.htm