Vous pouvez calculer l'heure exacte avec NTP (Network Time Protocol) dans votre code,
Je vais essayer de vous expliquer :
- Nous avons l'heure du client lors de l'envoi de la demande (par exemple 4/3/2012 13:56:10.123).
- Vous envoyez ClientTime au serveur
- Nous avons Durée de l'aller-retour pour la demande, je l'ai appelée Heure de la demande (par exemple : Il faut 5 secondes)
- Dans le serveur, nous calculons la différence de temps entre le serveur et le client (par exemple) : Il ServerTime - ClientTime = ServerClientDifferenceTimeWithRequestTime), il faut maintenant que cette différence comprenne le temps d'aller-retour de la demande à l'étape 3, puis il faut retirer le temps d'aller-retour de la différence.
- Serveur Envoi d'une réponse comprenant ServerClientDifferenceTimeWithRequestTime et ServerTime
- Nous avons Durée de l'aller-retour pour la réponse, je l'ai appelée Temps de réponse (par exemple : Il faut 3 secondes)
- Dans le cas du client, nous calculons à nouveau la différence de temps entre le serveur et le client (par exemple) : Il ServerTime - ClientTime = ServerClientDifferenceTimeWithResponseTime), encore une fois : vous devriez maintenant cette différence y compris le temps de réponse aller-retour à l'étape 6.
- Nous avons maintenant du temps dans le client
- Vous devez calculer des équations simples dans le client :
X(SyncedTime) \= Now + (ServerClientDifferenceTimeWithRequestTime - RquestTime)
X(SyncedTime) \= Now + (ServerClientDifferenceTimeWithResponseTime - ResponseTime)
Now - ClientTime = RquestTime + ResponseTime
=>
Now - (ServerClientDiffRq - RquestTime) = Now - (ServerClientDiffRs - ResponseTime)
si vous avez résolu le problème, vous avez trouvé ceci :
ResponseTime = (ServerClientDifferenceTimeWithRequestTime - Now + ClientTime + - ServerClientDifferenceTimeWithResponseTime )/2
et vous pouvez ensuite trouver l'heure synchronisée ou l'heure du serveur dans le client avec cette équation :
X(SyncedTime) \= Now + (ServerClientDifferenceTimeWithResponseTime - ResponseTime)
Je montre un code simple, mais si vous voulez l'écrire, n'oubliez pas d'utiliser les fonctions de date et d'heure UTC...
Côté serveur (par exemple php, c#) :
PHP :
header('Content-Type: application/json; charset=utf-8');
$clientTime = $_GET["ct"] * 1; //for php 5.2.1 or up: (float)$_GET["ct"];
$serverTimestamp = round(microtime(true)*1000); // (new DateTime())->getTimestamp();
$serverClientRequestDiffTime = $serverTimestamp - $clientTime;
echo "{\"diff\":$serverClientRequestDiffTime,\"serverTimestamp\":$serverTimestamp}";
C# :
long clientTime = long.Parse(Request.Form["ct"]);
long serverTimestamp = (DateTime.Now.Ticks-(new DateTime(1970,1,1) - DateTime.MinValue).Ticks) / 10000;
long serverClientRequestDiffTime = serverTimestamp - clientTime;
Response.Write("{\"diff\":"+serverClientRequestDiffTime+",\"serverTimestamp\":"+serverTimestamp+"}");
Côté client (Javascript avec Jquery ):
var clientTimestamp = (new Date()).valueOf();
$.getJSON('http://yourhost.com/getdatetimejson/?ct='+clientTimestamp, function( data ) {
var nowTimeStamp = (new Date()).valueOf();
var serverClientRequestDiffTime = data.diff;
var serverTimestamp = data.serverTimestamp;
var serverClientResponseDiffTime = nowTimeStamp - serverTimestamp;
var responseTime = (serverClientRequestDiffTime - nowTimeStamp + clientTimestamp - serverClientResponseDiffTime )/2
var syncedServerTime = new Date((new Date()).valueOf() + (serverClientResponseDiffTime - responseTime));
alert(syncedServerTime);
});