gettimezoneoffset - Detecta abreviatura de zona horaria con JavaScript
set timezone javascript (14)
Necesito una forma de detectar la zona horaria de un objeto de fecha determinado. NO quiero el desplazamiento, ni quiero el nombre completo de la zona horaria. Necesito obtener la abreviatura de zona horaria. Por ejemplo, GMT, UTC, PST, MST, CST, EST, etc.
es posible? Lo más cerca que he estado es analizar el resultado de date.toString (), pero incluso eso no me dará una abreviatura. Me da el nombre largo de la zona horaria.
Pruebe la clase de cierre de Google goog.i18n.DateTimeSymbols y sus clases relacionadas con la configuración regional.
Si todo lo demás falla, simplemente puede crear su propia tabla hash con los nombres largos y las abreviaturas .
[perdón por cómo escribo inglés]
Hola, el objeto de fecha no tiene un método para obtener la abreviación de zona horaria, pero está implícito allí casi al final del retorno de toString:
por ejemplo
var rightNow = new Date();
alert(rightNow);
la salida será algo así como "mié 30 de feb de 2011 17:29:16 GMT-0300 (ART)" entonces, puede aislar lo que está entre paréntesis "ART" que es la abreviación de zona horaria
var rightNow = new Date();
alert(String(String(rightNow).split("(")[1]).split(")")[0]);
la salida será "ART"
es demasiado tarde para responder, pero espero que sea útil para alguien
Para un soporte de navegador cruzado , recomiendo usar YUI 3 Library:
Y.DataType.Date.format(new Date(), {format:"%Z"});
Es compatible con identificadores strftime .
Para más información: http://yuilibrary.com/yui/docs/datatype/#dates
Sé que el problema sigue siendo las diferencias entre los navegadores, pero esto es lo que solía obtener en Chrome. Sin embargo, todavía no es una abreviatura porque Chrome devuelve el nombre largo.
new Date().toString().replace(/^.*GMT.*/(/, "").replace(//)$/, "")
moment-timezone incluye un método no documentado .zoneAbbr()
que devuelve la abreviatura de zona horaria. Esto también requiere un conjunto de reglas que están disponibles para seleccionar y descargar según sea necesario.
Haciendo esto:
<script src="moment.js"></script>
<script src="moment-timezone.js"></script>
<script src="moment-timezone-data.js"></script>
<script>
moment().tz("America/Los_Angeles").zoneAbbr();
</script>
Devoluciones:
''PDT'' // As of this posting.
No es posible con JavaScript vano. Los navegadores son inconsistentes sobre la devolución de cadenas de zonas horarias. Algunas compensaciones de retorno como +0700
mientras que otras devuelven PST
.
No es consistente ni confiable, por lo que necesita un script de terceros como moment.js
(y moment-timezone.js
) o cree su propia tabla hash para convertir entre compensaciones y abreviaturas de zona horaria.
Actualizado para 2015:
jsTimezoneDetect se puede usar junto con moment-timezone para obtener la abreviatura de zona horaria del lado del cliente:
moment.tz(new Date(), jstz.determine().name()).format(''z''); //"UTC"
Moment-timezone no puede hacer esto por sí solo ya que su función que solía manejar esto se depreció porque no funcionaba en todas las circunstancias: https://github.com/moment/moment/issues/162 para obtener la abreviatura de zona horaria del lado del cliente .
Esto funciona perfectamente en Chrome, Firefox pero solo en IE11. En IE11, las zonas horarias sin abreviaturas simples como "Indian Chagos Time" devolverán "ICT" en lugar del "IOT" correcto.
var result = "unknown";
try{
// Chrome, Firefox
result = /.*/s(.+)/.exec(date.toLocaleDateString(navigator.language, { timeZoneName:''short'' }))[1];
}catch(e){
// IE, some loss in accuracy due to guessing at the abbreviation
// Note: This regex adds a grouping around the open paren as a
// workaround for an IE regex parser bug
result = (new Date()).toTimeString().match(new RegExp("[A-Z](?!.*[/(])","g")).join('''');
}
console.log(result);
Resultado:
"CDT"
Una solución nativa:
var zone = new Date().toLocaleTimeString(''en-us'',{timeZoneName:''short''}).split('' '')[2]
console.log(zone)
Pude lograr esto solo en un momento.
moment.tz(moment.tz.guess()).zoneAbbr() //IST
try {
result = /.*/s(.+)/.exec(date.toLocaleDateString(navigator.language, {timeZoneName:''short'' }))[1];
} catch(e) {
result = (new Date()).toTimeString().match(new RegExp("[A-Z](?!.*[/(])","g")).join('''');
}
console.log(result);
Este es un tema complicado. Por lo que veo, la zona horaria no está integrada como parte del objeto Date cuando se creó. Tampoco puede configurar la zona horaria para un objeto Date. Sin embargo, hay una compensación de zona horaria que puede obtener de un objeto Date que está determinado por la configuración del sistema host del usuario (zona horaria). Piense en la zona horaria como una forma de determinar el desplazamiento desde UTC.
Para facilitar la vida, recomiendo el moment
y el moment-timezone
para manejar estas cosas. Moment crea un objeto envoltorio para Date
con una buena API para todo tipo de cosas.
Si se le proporciona un objeto de fecha existente a través de algún parámetro o algo, puede pasarle el constructor al crear un objeto de momento y está listo para rodar. En este punto, puede usar moment-timezone
para adivinar el nombre de la zona horaria del usuario y luego usar el formato momento-huso horario para obtener la abreviatura de la zona horaria. Me atrevería a decir que la mayoría de los usuarios tienen su zona horaria configurada automáticamente, pero no debe confiar en esto con una precisión del 100%. Si es necesario, también puede configurar manualmente la zona horaria que desea usar antes de seleccionar el formato que necesita.
En general, cuando se trabaja con fecha y hora, es mejor almacenar el UTC en su base de datos y luego usar el momento js para formatear la hora de la zona horaria del usuario al mostrarla. Puede haber casos en los que deba asegurarse de que la zona horaria sea correcta. Por ejemplo, si permite que un usuario programe algo para una fecha y hora específica. Debería asegurarse de que con un usuario de la costa oeste establezca la zona horaria en PDT / PST antes de convertirla a UTC para almacenarla en su base de datos.
En cuanto a la abreviatura de la zona horaria ...
Aquí hay un ejemplo básico para obtener la abreviatura de zona horaria utilizando momento y momento-zona horaria.
// if all you need is the user''s timezone abbreviation you don''t even need a date object.
const usersTimezoneName = moment.tz.guess()
const timezoneAbbr = moment().tz(usersTimezoneName).format(''z'')
console.log(timezoneAbbr) // PST (depending on where the user is)
// to manually set the timezone
const newYorkAbbr = moment(dateObj).tz(''America/New_York'').format(''z'')
console.log(newYorkAbbr) // EST
Para mostrar un objeto de fecha específico con compensaciones para una zona horaria específica, puede hacerlo.
const xmas = new Date(''December 25, 2017 16:20:00'')
const losAngelesXmas = moment(xmas).tz(''America/Los_Angeles'')
console.log(losAngelesXmas.format("dddd, MMMM Do YYYY, h:mm:ss a")) // Monday, December 25th 2017, 4:20:00 pm
Esta es una pantalla de fecha / hora con formato de 12 horas que se actualiza automáticamente y no responde la pregunta, aunque puede ayudar a otros a medida que se relaciona y se basa en la solución de Stephen DuMont y el enlace MDN . W3 Schools tuvo un tutorial muy útil y las actualizaciones en tiempo real no requieren actualización de página.
Las pruebas con las últimas versiones de escritorio Firefox, Chrome, Opera e Internet Explorer 11 funcionan. La hora de "2 dígitos" solo aparece como prefijo cero para valores individuales en IE, sin embargo, los minutos devuelven un valor de 2 dígitos confiable para todos los navegadores. Las pruebas con el trabajo descontinuado de Windows Safari aunque el formato de 12 horas se ignora y los segundos no se ocultan.
La función incluye la zona horaria local, así como opciones ajustables para lenguajes alternativos, visualización de día y fecha y formato de 12/24 horas. La fecha y la hora se dividieron para agregar la cadena de separación ''at''. Configurar solo ''toLocaleTimeString'' con las opciones de selección también devolverá la fecha y la hora. Las páginas MDN se pueden referenciar para opciones y valores.
<!--
function dateTimeClock() {
var date = new Date();
document.getElementById(''timedate'').innerHTML = date.toLocaleDateString([''en-us'', ''en-GB''], {
weekday: ''long'',
month: ''long'',
day: ''2-digit'',
year: ''numeric''
}) + '' at '' +
date.toLocaleTimeString([''en-us'', ''en-GB''], {
hour12: ''true'',
hour: ''2-digit'',
minute: ''2-digit'',
timeZoneName: ''short''
});
var t = setTimeout(dateTimeClock, 500);
}
function start() {
dateTimeClock();
}
window.onload = start;
//-->
<div id="timedate"></div>