Ottenere l’attuale ora mondiale GMT

Come posso ottenere l’ora corrente? (in JavaScript)

Non è il momento del tuo computer come:

now = new Date; now_string = addZero(now.getHours()) + ":" + addZero(now.getMinutes()) + ":" + addZero(now.getSeconds()); 

Ma il vero tempo mondiale preciso?

Devo connettermi a un server (molto probabilmente sì, quale? E come posso recuperare il tempo da esso?)

Tutte le ricerche che faccio da google restituiscono la (new Date).getHours() .

Modificare:

Voglio evitare di mostrare un orario errato se l’utente ha un orario sbagliato nel suo computer.

Innanzitutto, per ottenere l’ora esatta GMT hai bisogno di una fonte di cui ti fidi. Ciò significa che alcuni server da qualche parte. Javascript può generalmente effettuare solo chiamate HTTP e solo al server che ospita la pagina in questione (stessa politica di origine). Quindi quel server deve essere la tua fonte per l’ora GMT.

Configurerei il tuo server web per utilizzare NTP per sincronizzare il suo orologio con GMT e chiedere al server web di indicare allo script a che ora è, scrivendo una variabile sulla pagina. Altrimenti, make e XmlHttpRequest tornano al server quando è necessario conoscere l’ora. Il lato negativo è che questo sarà inaccurato a causa della latenza coinvolta: il server determina il tempo, lo scrive alla risposta, la risposta viaggia sulla rete e il javascript viene eseguito ogni volta che la CPU del client gli dà un timeslice, ecc. collegamento lento ci si può aspettare secondi di ritardo se la pagina è grande. Potresti essere in grado di risparmiare un po ‘di tempo determinando quanto lontano da GMT è l’orologio dell’utente, e semplicemente regolando tutti i calcoli temporali di quell’offset. Ovviamente se l’orologio dell’utente è lento o veloce (non solo in ritardo o in anticipo) o se l’utente cambia l’ora sul proprio PC, l’offset è saltato.

Inoltre, tieni presente che il cliente può modificare i dati, quindi non fidarti di timestamp che ti inviano.

Modifica : la risposta di JimmyP è molto semplice e facile da usare: usa Javascript per aggiungere un elemento che chiama un url come http://json-time.appspot.com/time.json?tz=GMT . Questo è più facile rispetto a questo perché il server json-time.appspot.com funziona come una fonte di tempo GMT e fornisce questi dati in un modo che consente di aggirare la politica dell'origine stessa. Lo consiglierei per siti semplici. Tuttavia ha uno svantaggio principale: il sito json-time.appspot.com può eseguire codice arbitrario sulle pagine dell'utente. Ciò significa che se gli operatori di quel sito vogliono profilare i tuoi utenti o dirottare i loro dati, possono farlo banalmente. Anche se ti fidi degli operatori, devi anche aver fiducia che non siano stati compromessi o compromessi. Per un sito aziendale o qualsiasi sito con problemi di alta affidabilità, consiglierei di ospitare voi stessi la soluzione per il tempo.

Modifica 2 : la risposta di JimmyP ha un commento che suggerisce che l'app json-time ha alcune limitazioni in termini di numero di richieste che può supportare. Questo significa che se hai bisogno di affidabilità dovresti ospitare tu stesso il server del tempo. Tuttavia, dovrebbe essere abbastanza semplice aggiungere una pagina sul tuo server che risponde con lo stesso formato di dati. Fondamentalmente il tuo server prende una query come

 http://json-time.appspot.com/time.json?tz=America/Chicago&callback=foo 

e restituisce una stringa come

 foo({ "tz": "America\/Chicago", "hour": 15, "datetime": "Thu, 09 Apr 2009 15:07:01 -0500", "second": 1, "error": false, "minute": 7 }) 

Nota foo() che avvolge l'object JSON; questo corrisponde al callback = foo nella query. Ciò significa che quando lo script viene caricato nella pagina chiamerà la tua funzione foo, che può fare tutto ciò che vuole con il tempo. La programmazione lato server per questo esempio è una domanda separata.

Puoi utilizzare JSON [P] e accedere a un’API dell’ora:

(Il codice sotto dovrebbe funzionare perfettamente, appena testato …)

 function getTime(zone, success) { var url = 'http://json-time.appspot.com/time.json?tz=' + zone, ud = 'json' + (+new Date()); window[ud]= function(o){ success && success(new Date(o.datetime)); }; document.getElementsByTagName('head')[0].appendChild((function(){ var s = document.createElement('script'); s.type = 'text/javascript'; s.src = url + '&callback=' + ud; return s; })()); } getTime('GMT', function(time){ // This is where you do whatever you want with the time: alert(time); }); 

Perché non mandi il tempo con ogni pagina? Ad esempio da qualche parte nel codice HTML:

  

Quindi è ansible eseguire un Javascript mentre il sito carica e interpreta la data. Ciò ridurrebbe la quantità di lavoro che la rete deve svolgere. È ansible memorizzare l’ora locale corrispondente e calcolare l’offset ogni volta che ne avete bisogno.

È ansible utilizzare getTimezoneOffset per ottenere lo scostamento tra la data locale e quella GMT, quindi eseguire i calcoli matematici. Ma questo sarà preciso solo come l’orologio dell’utente.

Se si desidera un orario preciso, è necessario connettersi a un server NTP . A causa della stessa politica di origine , non è ansible presentare una richiesta con JS a un altro server, quindi al proprio. Ti suggerisco di creare uno script sul lato server che si connetta al server NTP (in PHP o qualsiasi altra lingua tu voglia) e restituisca la data esatta. Quindi, utilizzare una richiesta AJAX per leggere questa volta.

Una piccola aggiunta a Mr. Shiny e New e James risponde

Ecco uno script PHP che puoi inserire sul tuo server e utilizzare al posto di json-time.appspot.com

  ({ "tz": "", "hour": , "datetime": "", "second": , "error": "", "minute":  }) 

Come Mr. Shiny e New hanno detto, hai bisogno di un server da qualche parte con il tempo corretto. Può essere il server in cui si trova il sito o un altro server che invia l’ora corretta in un formato che è ansible leggere.

Se si desidera utilizzare la data più volte nella pagina, a distanza di uno o più secondi, probabilmente non si desidera ottenere l’ora dal server ogni volta, ma invece memorizzare la differenza e utilizzare l’orologio client. Se questo è il caso, ecco una delle tante soluzioni:

 var MyDate = new function() { this.offset = 0; this.calibrate = function (UTC_msec) { //Ignore if not a finite number if (!isFinite(UTC_msec)) return; // Calculate the difference between client and provided time this.offset = UTC_msec - new Date().valueOf(); //If the difference is less than 60 sec, use the clients clock as is. if (Math.abs(this.offset) < 60000) this.offset = 0; } this.now = function () { var time = new Date(); time.setTime(this.offset + time.getTime()); return time; } }(); 

Inseriscilo nella tua pagina e lascia che il tuo script lato server produca una riga come:

 MyDate.calibrate(1233189138181); 

dove il numero è l'ora corrente in millisecondi dal 1 ° gennaio 1970. Puoi anche usare il tuo framework preferito per AJAX e farlo chiamare la funzione sopra. Oppure puoi usare la soluzione suggerita da JimmyP . Ho riscritto la soluzione JimmyPs per essere inclusa nella mia soluzione. Basta copiare e incollare quanto segue all'interno della funzione sopra:

  this.calibrate_json = function (data) { if (typeof data === "object") { this.calibrate (new Date(data.datetime).valueOf() ); } else { var script = document.createElement("script"); script.type="text/javascript"; script.src=(data||"http://json-time.appspot.com/time.json?tz=UTC") + "&callback=MyDate.calibrate_json"; document.getElementsByTagName('head')[0].appendChild(script); } } this.calibrate_json(); //request calibration with json 

Si noti che se si modifica il nome della funzione da MyDate, è necessario aggiornare la callback in this.calibrate_json sulla riga script.src .

Spiegazione:

Mydate.offset è l'attuale offset tra il tempo del server e l'orologio dei client in millisecondi.

Mydate.calibrate (x); è una funzione che imposta un nuovo offset. Si aspetta che l'input sia l'ora corrente in millisecondi dal 1 ° gennaio 1970. Se la differenza tra il server e l'orologio client è inferiore a 60 secondi, verrà utilizzato l'orologio client.

Mydate.now () è una funzione che restituisce un object data che ha l'ora calibrata corrente.

Mydate.calibrate_json (data) è una funzione che accetta un URL in una risorsa che restituisce una risposta datetime o un object con l'ora corrente (utilizzata come callback). Se non viene fornito nulla, verrà utilizzato un URL predefinito per ottenere il tempo. L'URL deve avere un punto interrogativo "?" dentro.

Semplice esempio di come aggiornare un elemento con l'ora corrente ogni secondo:

 setInterval( function () { var element = document.getElementById("time"); if (!element) return; function lz(v) { return v < 10 ? "0" + v : v; } var time = MyDate.now(); element.innerHTML = time.getFullYear() + "-" + lz(time.getMonth() + 1) + "-" + lz(time.getDate()) + " " + lz(time.getHours()) + ":" + lz(time.getMinutes()) + ":" + lz(time.getSeconds()) ; },1000); 

Mi sono imbattuto in un’altra soluzione per coloro che non hanno accesso al lato server delle cose. Una risposta alla domanda Ottenere il tempo predefinito del server in jQuery? .

Fondamentalmente, puoi prendere l’intestazione “Date” facendo una richiesta AJAX HEAD a “/”. Non tutti i server supportano questo e potrebbe richiedere un po ‘jiggery-pockery per farlo funzionare con un server particolare.

Controlla la vera risposta per maggiori dettagli.

Abbiamo utilizzato un’API da EarthTools con molto successo:

EarthTools

Il servizio restituisce XML con informazioni come gli attuali offset GMT e fuso orario (quando si forniscono latitudine e longitudine). Abbiamo usato un WebClient in combinazione con un XMLDocument nel back-end VB della nostra pagina ASP.NET per leggere e interpretare l’XML.

Puoi farlo in PHP

 {'datetime'}; $hournow= $obj->{'hour'}; $minutenow= $obj->{'minute'}; $secondnow= $obj->{'second'}; ?> 

$timenow contiene la data e l’ora complete: “Lun, 05 Mar 2012 01:57:51 +0000”, $hournow : “1” $minutenow : “57”.

Dal momento che il servizio relativo alla risposta di James sembra non funzionare più, ho trovato un’altra buona API di rest che può essere utilizzata per questo scopo e funziona perfettamente. La fonte è questo sito: timeapi e il codice che puoi usare è semplicemente questo (usando la libreria jQuery e il callback jsonp fornito dall’API):

  $.getJSON("http://www.timeapi.org/utc/now.json?callback=?",function(json){ //console.log(json) alert(json.dateString); }); 

Con questo avrai la data e l’ora nel fomat come

  September 02, 2016 09:59:42 GMT+0100 

Se vuoi manipolarlo in javascript, per avere le ore, basta trasformarlo in un object Date come questo:

  new Date(json.dateString) 

Quindi, per esempio, puoi scrivere così:

  $.getJSON("http://www.timeapi.org/utc/now.json?callback=?",function(json){ var now = new Date(json.dateString); var hours = now.toLocaleTimeString(); alert(hours) }); 

in questo modo avrai l’ora locale esatta in ore.

IMO, la soluzione più semplice è quella di avviare AWS Lambda (o Google Serverless) e collegarlo tramite API Gateway, offrendo un timeserver senza gestire alcuna infrastruttura. Il mio codice Lambda:

 import datetime import json def lambda_handler(event, context): dt = datetime.datetime.utcnow() return { 'statusCode': 200, 'body': json.dumps({ 'iso_time': dt.strftime('%Y-%m-%dT%H:%M:%SZ') }) } 

Se il tuo javascript è servito dal server web, puoi utilizzare questa semplice funzione per richiedere tempo da questo server. Funzionerà se il server restituisce l’intestazione della data nella risposta HTTP.

 function getServerTime() { var req = new XMLHttpRequest(); req.open('GET', document.location, false); req.send(null); return new Date(req.getResponseHeader("Date")); } 

A causa del caching, questo potrebbe restituire un orario errato. Per risolvere questo problema puoi usare l’URL casuale:

 req.open('GET', "/time?r=" + Math.floor(Math.random()*10000000), false);