2010-05-24 6 views
20

Necesito determinar la zona horaria del cliente (por ejemplo, CET, GMT, EST) en JS. Obtener el desplazamiento es sencillo, pero no tiene toda la información necesaria para determinar el TZ, al menos no fácilmente. Tengo la sensación de que podría ser ser posible usar una combinación de desplazamiento, si el DST está en uso y en efecto, etc. pero espero que alguien más haya hecho el trabajo ya, especialmente considerando las extrañas excepciones cuando se trata del tiempo .Obtener zona horaria del cliente (no cantidad de compensación GMT) en JS

This question es similar, pero tanto la pregunta como la respuesta se basan en la suposición (incorrecta) de que el formato DateString de cada navegador incluye el nombre de la zona horaria, que no es así. Ese es un detalle de implementación.

Por lo tanto, con eso estoy actualmente atascado.

Respuesta

7

Ver this question. No es factible en el caso general, pero para elegir una zona horaria predeterminada de una lista restringida de casos probables, puede hacer una suposición decente.

Permitir que el usuario lo anule cuando adivine mal.

+0

De hecho, esto solo es necesario para proporcionar un deducción decente. Si puede rellenar correctamente para el 90% de los usuarios, estaría muy contento. –

+0

Hola ... con esto, obtendremos la zona horaria como decir Aisa/Kabul y luego cómo convertirla a 'AFT' (forma abreviada) ?? – Jeevi

+0

@TFool: desafortunadamente, no hay una búsqueda públicamente disponible para la región-> timezone-name que conozco, por lo que tendrá que hacer la suya propia. (En realidad, ni siquiera existe un conjunto de abreviaturas de zona horaria aceptado a nivel mundial). Tenga en cuenta que no existe un mapeo de uno a uno: por ejemplo, si obtiene la región, tendrá que decidir si utiliza el 'GMT' o zona horaria 'BST', dependiendo de en qué parte del año se encuentre el tiempo que desea expresar. – bobince

1

Lo que yo haría es determinar el estándar y la compensación de la luz del día (que suena como si ya lo supiera. Si no, puede comenzar con esta referencia http://onlineaspect.com/examples/timezone/detect_timezone.js de Josh Fraser). La determinación de la zona horaria siempre se puede hacer en el lado del servidor una vez que se conocen los desplazamientos estándar y de luz diurna. A continuación, se puede usar una llamada Ajax para que nunca se necesite actualizar la página. El resultado final es que ahora tiene la zona horaria en el lado de JavaScript.

+0

enlace que dice no se encontró. – Ikrom

+0

Este es el enlace corregido, supongo: http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/ – Dichev

-4

Si lo que desea es offset, entonces esto es mucho más simple

var CURDATE = new Date();

var offset = curdate.getTimezoneOffset();

+1

El OP era buscando el nombre abreviado de la zona horaria. – Gary

+0

El OP dijo específicamente que esto no era lo que se quería. Ver el título: "__no cantidad compensada GMT__" – Nateowami

32

Podría rasparlo desde el método toString() de un objeto de fecha. new Date.toString() produce algo así como Wed Sep 19 2012 10:04:32 GMT-0400 (Eastern Daylight Time) en Firefox, Safari y Chrome. La información que desea está allí, las letras mayúsculas entre paréntesis. Todo lo que se necesita es rasparlos.

En el caso de Internet Explorer, el resultado de toString() ya incluye el EDT.

En el caso de Opera, su única opción es conformarse con GMT-0400 o similar. No hay nada que se pueda raspar en el método toString().

var now = new Date().toString(); 
var TZ = now.indexOf('(') > -1 ? 
now.match(/\([^\)]+\)/)[0].match(/[A-Z]/g).join('') : 
now.match(/[A-Z]{3,4}/)[0]; 
if (TZ == "GMT" && /(GMT\W*\d{4})/.test(now)) TZ = RegExp.$1; 

resultados Ejemplo:

  • Firefox: TZ = "EDT"

  • Safari: TZ = "EDT"

  • Chrome: TZ = "EDT"

  • IE: TZ = "EDT"

  • Opera: TZ = "GMT-0400"

Parece que funciona igual de bien con todas las zonas horarias de Asia y Europa aleatorios que probé así, volviendo WPST para Guam (West Pacific Standard Time), MPST de Kuala Lumpur (Tiempo estándar de la península malaya), etc .; y se degrada pacíficamente a la notación GMT + 0X00 donde el navegador no proporciona el nombre (Perth, por ejemplo).

+0

Fantástico. Exactamente lo que MUCHA gente está buscando Imagino – Yablargo

+1

Gracias por esto, lo estamos usando. Pero no funciona en todas partes del mundo. Arroja un error en Arabia Saudita, por ejemplo. * No se puede llamar al método 'join' de null *. Por ahora lo estoy envolviendo en un try/catch, y ajustando TZ a 'mi hora local' como una solución rápida. Estoy seguro de que hay una mejor solución que hacer, pero esta es rápida :) – tom

+0

p.s. Supongo que el problema es que Date.toString() no devuelve un valor usando el alfabeto romano, por lo que la expresión regular no coincide – tom

0

A partir de this answer a otra pregunta, he encontrado que IP API también le da la zona horaria - bastante práctico:

$.ajax({ 
    url: "http://ip-api.com/json", 
    type: 'GET', 
    success: function(json) { 
     console.log("Timezone: " + json.timezone); 
    }, 
    error: function(err) { 
     console.log("Request failed, error= " + err); 
    } 
}); 
Cuestiones relacionadas