¿Cómo puedo obtener el nombre de la zona horaria en JavaScript?

116

Sé cómo compensar la zona horaria, pero lo que necesito es la capacidad de detectar algo como "América / Nueva York". ¿Es eso incluso posible desde JavaScript o es algo que voy a tener que estimar en función del desplazamiento?

Mike Thomsen
fuente
2
Aquí hay una función que escribió Jon Nylander, tal vez ayude a bitbucket.org/pellepim/jstimezonedetect
yunzen
Aquí hay una respuesta relacionada que podría ayudar: stackoverflow.com/a/19421672/1447034
Douglas
Posible duplicado de la abreviatura
jberryman

Respuestas:

239

La API de internacionalización admite la obtención de la zona horaria del usuario y es compatible con todos los navegadores actuales.

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)

Tenga en cuenta que en algunas versiones anteriores del navegador que admiten la API de internacionalización, la timeZonepropiedad se establece en en undefinedlugar de la cadena de zona horaria del usuario. Lo mejor que puedo decir, en el momento de escribir este artículo (julio de 2017), todos los navegadores actuales, excepto IE11 , devolverán la zona horaria del usuario como una cadena.

Daniel Compton
fuente
6
Nunca pensé que fuera tan simple
Mohammed Shareef C
5
¡Increíble, el primero que he visto que no usa el momento! Gracias
r0bb077
3
Solución impresionante. No quería incluir todo el complemento de zona horaria del momento para esto.
Joan Gil
1
solución muy simple y agradable!
blackiii
2
@DanielCompton oh, no sabía nada de esta tabla, gracias por corregirla nuevamente.
CommonSenseCode
9

La respuesta más votada es probablemente la mejor manera de obtener la zona horaria, sin embargo, Intl.DateTimeFormat().resolvedOptions().timeZonedevuelve el nombre de la zona horaria de IANA por definición, que está en inglés.

Si desea el nombre de la zona horaria en el idioma del usuario actual, puede analizarlo a partir Datede la representación de cadena de la siguiente manera:

function getTimezoneName() {
  const today = new Date();
  const short = today.toLocaleDateString(undefined);
  const full = today.toLocaleDateString(undefined, { timeZoneName: 'long' });

  // Trying to remove date from the string in a locale-agnostic way
  const shortIndex = full.indexOf(short);
  if (shortIndex >= 0) {
    const trimmed = full.substring(0, shortIndex) + full.substring(shortIndex + short.length);
    
    // by this time `trimmed` should be the timezone's name with some punctuation -
    // trim it from both sides
    return trimmed.replace(/^[\s,.\-:;]+|[\s,.\-:;]+$/g, '');

  } else {
    // in some magic case when short representation of date is not present in the long one, just return the long one as a fallback, since it should contain the timezone's name
    return full;
  }
}

console.log(getTimezoneName());

Probado en Chrome y Firefox.

Por supuesto, esto no funcionará como se esperaba en algunos de los entornos. Por ejemplo, node.js devuelve un desplazamiento GMT (p GMT+07:00. Ej. ) En lugar de un nombre. Pero creo que todavía se puede leer como alternativa.

PD No funcionará en IE11, solo como la Intl...solución.

mrnateriver
fuente
3

Recuperar zona horaria por nombre (es decir, "América / Nueva York")

moment.tz.guess();
Omer
fuente
9
Por favor, mencione que también es simplemente posible sin ninguna dependencia:Intl.DateTimeFormat().resolvedOptions().timeZone
user2923322
1
Sí, aunque moment-js también adivina TZ para "navegadores" que no admiten esa función. :)
Ferran Maylinch
en IE11 Intl.DateTimeFormat().resolvedOptions().timeZonedevuelve undefined, pero moment.tz.guess()devuelve el valor correcto
Antoni4
0

Esto obtiene el código de zona horaria (por ejemplo, GMT) en javascript antiguo (estoy usando el script de la aplicación de Google con el motor antiguo):

function getTimezoneName() {
  return new Date().toString().get(/\((.+)\)/);
}

Solo pongo esto aquí en caso de que alguien lo necesite.

Toddmo
fuente
1
Creo que eso solo funciona para UTC/ GMT. Parece que otros están detallados; ej Pacific Daylight Time.
Ian Dunn
-1

Pruebe este código, consulte desde aquí

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
  $(document).ready(function(){
    var tz = jstz.determine(); // Determines the time zone of the browser client
    var timezone = tz.name(); //'Asia/Kolhata' for Indian Time.

    alert(timezone);
});
</script>
Kumar Shanmugam
fuente
-5

En javascript, el método Date.getTimezoneOffset () devuelve el desplazamiento de la zona horaria de UTC, en minutos, para la configuración regional actual.

var x = new Date();
var currentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;

Moment'timezone será una herramienta útil. http://momentjs.com/timezone/

Convertir fechas entre zonas horarias

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00
usuario3345614
fuente
4
No entendiste la que.
srsajid
3
Sus ejemplos de código no están relacionados con la pregunta original. ¿Cómo usaría esta biblioteca para devolver el nombre de la zona horaria actual del usuario?
Joe White