2012-10-05 3 views
2

Disons que j'ai un script PHP qui fait cela:temps Unix sur différents appareils dans des fuseaux horaires différents

$timeNow = 1349852400000; // Unix time for Oct 10, 2012 00:00:00 PDT 
echo "<script type='text/javascript'>"; 
echo  "setTimeout(function(){alert('time out!');}, $timeNow - Date.now());"; 
echo "</script>"; 

si ce script est servi à un appareil dont la date/heure sont fixés à 2013. À quoi se produire? Que se passe-t-il si cela est diffusé sur un appareil dont la date et l'heure sont définies en 2010?

L'heure et la date de l'horloge du serveur sont-elles importantes? Comment cela affecte-t-il l'appareil en 2013? Qu'en est-il de celui qui a été bloqué en 2010?

Si je voulais choisir une valeur pour $timeNow qui va lancer l'alerte pour le moment partout synchronisé le 10 Octobre 2012 à 00:00:00 pour San Francisco, CA (c'est-à-dire, un appareil qui est réglé à l'heure du Pacifique et un appareil réglé sur l'heure centrale devrait afficher l'alerte au même moment même s'il sera 2:00:00 AM pour l'appareil de l'heure centrale), pourrais-je le faire? Est-ce que je n'aurai pas à attribuer une valeur au périphérique Pacific et une valeur différente pour le périphérique Central afin de tenir compte de la différence de fuseau horaire par rapport à l'heure UTC? Désolé, les fuseaux horaires sont vraiment déroutants pour moi. J'ai du mal à envelopper ma tête autour d'eux.

+0

Qu'essayez-vous d'accomplir? btw avez-vous l'intention d'avoir une valeur négative comme timeout millis? – akostadinov

+0

J'essaie de découvrir comment fonctionne ce truc de temps. D'où les questions spécifiques. Dans quel cas aurais-je une valeur négative en tant que timeout millis? – user438293456

Répondre

1

Vous n'avez pas à vous soucier de quoi que ce soit si vous utilisez le temps Unix pour cela (à une exception ci-dessous). Il semble que vous vouliez que l'alerte apparaisse partout dans le monde au même instant, quel que soit le fuseau horaire.

temps Unix 0 est

  • 1 Janvier 1970, minuit, heure Zulu
  • 31 Décembre 1969, 16h00, heure de San Francisco

Donc, si vous pris des dispositions pour un Alerte à partir à l'heure 0, les gens à San Francisco et à Londres verraient l'alerte en même temps. Idem pour n'importe quel temps Unix, qui est vraiment juste un nombre qui décrit un instant dans le temps. Le même instant partout dans le monde. Ainsi, les deux chaînes de datetime suivantes

  • 1970-01-01T00: 00: 00Z
  • 1969-12-31T16: 00: 00-0800

sont des représentations de la même instant, dénotés par Unix temps 0.

De même, tout le monde voit l'heure 1349852400000 au même instant, quel que soit leur fuseau horaire. Donc, puisque votre code essaie d'alerter quelque chose à un instant donné décrit par un temps Unix, votre code devrait en principe fonctionner, à condition que les ordinateurs sur lesquels le script s'exécute soient réglés sur l'heure correcte.Je suppose que si vous voulez vraiment avoir un tas d'ordinateurs, alertez quelque chose en même temps (écrivez-vous un virus? Je plaisante) et vous voulez gérer le cas où les appareils peuvent avoir mal réglé les horloges, vous peut les faire faire des appels à un serveur de temps central et définir votre délai d'attente en fonction de cela. Ensuite, vous devrez probablement faire face à des problèmes inter-sites, mais en principe, si toutes les machines acceptent de parler et d'accepter les données d'un serveur de temps central, vous pouvez le faire.

ADDENDA

Voici comment cela pourrait fonctionner. Disons que votre script fonctionne sur un tas de machines. Ils ont tous leurs horloges toutes mal réglées. Peut-être qu'ils ont mal réglé leurs horloges volontairement; peut-être qu'ils ont mal réglé leurs horloges. Mais vous voulez qu'ils alertent tous en même temps. Donc ce que votre script devrait faire est ceci: faire un appel (Ajax) à votre serveur - le même serveur qui a livré la page HTML dans laquelle le script est incorporé, pour simplifier les problèmes inter-sites. Cet appel parle à votre serveur, qui connaît le temps réel. Maintenant vous connaissez également l'heure à partir de maintenant jusqu'à l'heure d'alerte. Donc, soustraire ces deux valeurs sur votre serveur et remettre aux clients ce nombre. Ensuite, les clients font

setTimeout(theAlertFunction, theValueReturnedFromTheAjaxCall) 

et vous êtes prêt à partir.

+0

Ha, est-ce que ma question semble avoir des intentions malveillantes? Je n'ai même pas réalisé! Je viens de créer un scénario pour une question dont la réponse m'aiderait à comprendre comment fonctionne le temps Unix. Merci! – user438293456

+0

Pas de problème, je plaisantais, bien sûr. La pensée d'une alerte apparaissant simultanément dans le monde entier au même instant m'a fait penser aux virus. Je ne sais pas pourquoi. ;-) –

+0

Donc, je suis toujours confus au sujet des périphériques dont la date/heure sont mal définies. Que se passe-t-il si ce n'est pas le résultat d'un problème de synchronisation de l'heure, mais que l'utilisateur définit manuellement l'heure en avant ou en arrière pour une raison quelconque? Est-ce important que le fait que l'ordinateur ne soit pas réglé à l'heure correcte est initié par l'utilisateur? – user438293456

0

Si le système de l'utilisateur est réglé sur une date erronée, vous ne pouvez rien y faire, si vous négligez ce cas, vous pouvez obtenir l'heure correcte pour l'horodatage de votre serveur dans n'importe quel système.

vous pouvez le décalage horaire de l'UTC dans n'importe quel fuseau horaire et l'ajouter à votre horodatage Bingo !!!

var d = new Date(); 
    var yourCorrectDate = new Date(timeNow +(d.getTimezoneOffset() * 60000)); 
// timenow is the time your server has sent 

vous donne décalage dans minuts

d.getTimezoneOffset() 
Questions connexes