Obteniendo la hora mundial GMT actual

¿Cómo puedo get la hora actual? (en JavaScript)

No es el momento de su computadora como:

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

Pero el time real del mundo exacto?

¿Necesito conectarme a un server (probablemente sí, cuál? Y ¿cómo puedo recuperar time de él?)

Todas las búsquedas que hago desde google devuelven la (new Date).getHours() .

Editar:

Quiero evitar mostrar una hora incorrecta si el usuario tiene una hora incorrecta en su computadora.

11 Solutions collect form web for “Obteniendo la hora mundial GMT actual”

En primer lugar, para get la hora GMT precisa, necesita una fuente en la que confíe. Esto significa algún server en alguna parte. Javascript generalmente solo puede hacer llamadas HTTP, y solo al server que aloja la página en cuestión (la misma política de origen). Por lo tanto, ese server debe ser su fuente para la hora GMT.

Configuraría su server web para usar NTP para sincronizar su reloj con GMT, y haría que el server web le diga al script qué hora es, escribiendo una variable en la página. O bien haga y XmlHttpRequest vuelva al server cuando necesite saber la hora. La desventaja es que esto será impreciso debido a la latencia involucrada: el server determina la hora, la escribe en la respuesta, la respuesta viaja por la networking y el javascript se ejecuta siempre que la CPU del cliente le da un intervalo de time, etc. enlace lento puede esperar segundos de retraso si la página es grande. Es posible que pueda ahorrar algo de time determinando qué tan lejos de GMT está el reloj del usuario, y simplemente ajustando todos los cálculos de time por ese desplazamiento. Por supuesto, si el reloj del usuario es lento o rápido (no solo tarde o temprano) o si el usuario cambia la hora en su PC, entonces su desplazamiento se agotará.

También tenga en count que el cliente puede cambiar los datos, así que no confíe en las marcas de time que le envían.

Editar : La respuesta de JimmyP es muy simple y fácil de usar: use Javascript para agregar un elemento <script> que llame a una url como http://json-time.appspot.com/time.json?tz=GMT . Esto es más fácil que hacer esto usted mismo porque el server json-time.appspot.com funciona como una fuente de time GMT, y proporciona estos datos de una manera que le permite trabajar con la misma política de origen. Lo recomendaría para sitios simples. Sin embargo, tiene un inconveniente importante: el sitio json-time.appspot.com puede ejecutar código arbitrario en las páginas de su usuario. Esto significa que si los operadores de ese sitio quieren perfilar a sus usuarios o secuestrar sus datos, pueden hacerlo trivialmente. Incluso si confías en los operadores, también debes confiar en que no han sido pirateados o comprometidos. Para un sitio de negocios o cualquier sitio con problemas de alta confiabilidad, le recomiendo que aloje la solución de time usted mismo.

Editar 2 : la respuesta de JimmyP tiene un comentario que sugiere que la aplicación json-time tiene algunas limitaciones en cuanto a la cantidad de requestes que puede admitir. Esto significa que si necesita confiabilidad, debe alojar el server de time usted mismo. Sin embargo, debería ser bastante fácil agregar una página en su server que responda con el mismo formatting de datos. Básicamente, su server toma una consulta como

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

y devuelve una cadena como

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

Tenga en count el foo() que envuelve el object JSON; esto corresponde a la callback = foo en la consulta. Esto significa que cuando el script se carga en la página llamará a su function foo, que puede hacer lo que quiera con el time. La progtwigción del lado del server para este ejemplo es una pregunta separada.

Puede usar JSON [P] y acceder a una API de time:

(El siguiente código debería funcionar perfectamente, solo lo probé …)

 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); }); 

¿Por qué no envías el time con cada página? Por ejemplo, en algún lugar del html:

 <span id="time" style="display:none;"> 2009-03-03T23:32:12 </span> 

Entonces podría ejecutar un Javascript mientras el sitio carga e interpreta la date. Esto networkinguciría la cantidad de trabajo que la networking tiene que hacer. Puede almacenar la hora local correspondiente y calcular el desplazamiento cada vez que lo necesite.

Puede usar getTimezoneOffset para get el desplazamiento entre la date local y GMT, y luego hacer los cálculos. Pero esto solo será tan preciso como el reloj del usuario.

Si desea una hora precisa, debe conectarse a un server NTP . Debido a la misma política de origen , no puede realizar una request con JS a otro server que no sea el suyo. Le sugiero que cree un script del lado del server que se conecte al server NTP (en PHP, o el idioma que desee) y devuelva la date exacta. Luego, use una request AJAX para leer esta vez.

Una pequeña adición a las respuestas de Mr. Shiny y New and James

Aquí hay un script PHP que puedes colocar en tu propio server y usar en vez de json-time.appspot.com

 <?php header('Content-Type: application/json'); header("Expires: Tue, 01 Jan 1990 00:00:00 GMT"); header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); $error = "false"; $tz = $_GET['tz']; if ( !in_array($tz, DateTimeZone::listIdentifiers())) { $error = 'invalid time zone'; $tz = 'UTC'; } date_default_timezone_set($tz); ?> <?php echo htmlspecialchars($_GET['callback'], ENT_QUOTES, 'UTF-8' ); ?>({ "tz": "<?php echo $tz ?>", "hour": <?php echo date('G'); ?>, "datetime": "<?php echo date(DATE_RFC2822); ?>", "second": <?php echo intval(date('s')); ?>, "error": "<?php echo $error; ?>", "minute": <?php echo intval(date('i')); ?> }) 

Como dijeron el Sr. Shiny y New , necesitas un server en algún lugar con la hora correcta. Puede ser el server donde se encuentra el sitio o algún otro server que envíe la hora correcta en un formatting que pueda leer.

Si desea utilizar la date varias veces en su página, con uno o más segundos de diferencia, probablemente no desee get el time del server cada vez, sino almacenar la diferencia en caching y usar el reloj de los clientes. Si ese es el caso, aquí hay una de muchas soluciones:

 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; } }(); 

Inclúyalo en su página y permita que su secuencia de commands del server produzca una fila como:

 MyDate.calibrate(1233189138181); 

donde el número es la hora actual en milisegundos desde el 1 de enero de 1970. También puede usar su marco de trabajo favorito para AJAX y hacer que llame a la function anterior. O puede usar la solución que JimmyP sugirió. He reescrito la solución de JimmyPs para includela en mi solución. Simplemente copy y pega lo siguiente dentro de la function de arriba:

  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 

Tenga en count que si cambia el nombre de la function de MyDate , debe actualizar la callback en this.calibrate_json en la línea script.src .

Explicación:

Mydate.offset es el desplazamiento actual entre la hora del server y el reloj de los clientes en milisegundos.

Mydate.calibrate (x); es una function que establece un nuevo desplazamiento. Espera que la input sea la hora actual en milisegundos desde el 1 de enero de 1970. Si la diferencia entre el server y el reloj del cliente es inferior a 60 segundos, se usará el reloj del cliente.

Mydate.now () es una function que devuelve un object de date que tiene la hora calibrada actual.

Mydate.calibrate_json (data) es una function que toma una url a un recurso que devuelve una respuesta de date y hora, o un object con la hora actual (utilizada como una callback). Si no se proporciona nada, utilizará una url pnetworkingeterminada para get el time. La url debe tener un signo de interrogación "?" en eso.

Ejemplo simple de cómo actualizar un elemento con la hora actual cada segundo:

 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); 

Me encontré con otra solución para aquellos que no tienen acceso al lado del server de las cosas. Una respuesta a la pregunta ¿ Obtener el time pnetworkingeterminado del server en jQuery? .

Básicamente, puede tomar el encabezado "Fecha" haciendo una request AJAX HEAD a "/". No todos los serveres admiten esto y puede llevar un poco de bazofia para que funcione con un server en particular.

Vea la respuesta real para más detalles.

Hemos utilizado una API de EarthTools con mucho éxito:

EarthTools

El service devuelve XML con información tal como el GMT actual y los offsets de zona horaria (cuando se proporciona latitud y longitud). Usamos un WebClient junto con un XMLDocument en el back-end de VB de nuestra página ASP.NET para leer e interpretar el XML.

Tu puedes hacer esto en PHP

 <?php $json = file_get_contents( "http://json-time.appspot.com/time.json?tz=GMT" ); $obj = json_decode($json); $timenow= $obj->{'datetime'}; $hournow= $obj->{'hour'}; $minutenow= $obj->{'minute'}; $secondnow= $obj->{'second'}; ?> 

$timenow contiene su date y hora completa: "lun, 05 mar 2012 01:57:51 +0000", $hournow : "1" $minutenow : "57".

Dado que el service relacionado con la respuesta de James parece no funcionar más, encontré otra API de buen descanso que se puede utilizar para este fin, y funciona bien. La fuente es este sitio: timeapi y el código que puede usar es simplemente esto (usando la biblioteca jQuery y la callback jsonp provistas por la API):

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

Con esto tendrás la date y hora en el formulario como

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

Si quieres manipularlo en javascript, para tener las horas, simplemente transfórmalo en un object Date como este:

  new Date(json.dateString) 

Entonces, por ejemplo, puedes escribir así:

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

de esta manera tendrá la hora local exacta en horas.

Si su javascript se sirve desde un server web, puede usar esta function simple para solicitar time desde este server. Funcionará si el server devuelve el encabezado Fecha en la respuesta HTTP.

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

Debido al almacenamiento en caching esto puede devolver el time equivocado. Para solucionar esto, puede usar una URL aleatoria:

 req.open('GET', "/time?r=" + Math.floor(Math.random()*10000000), false); 
Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.