javascript - fecha - moment.js examples
Detecta la identificación de la zona horaria del usuario actual usando moment.js (4)
Lo que estoy buscando es una forma de detectar el ID de la zona horaria del navegador (como se define en las tablas de Olson ) pero no me importa la ID exacta, solo necesito el ID de una zona horaria que funciona igual que la del usuario (por ejemplo, "Europa / Roma" está bien si el usuario está en París).
No estoy interesado en el desplazamiento actual, realmente necesito la zona horaria para poder enviarla al servidor para hacer cálculos para otras fechas (el servidor también tiene las tablas Olson).
Teóricamente, como ya uso la biblioteca de zona horaria de Moment.js y he incluido las tablas de Olson, no necesito nada más, pero no encuentro ninguna API para hacer la detección. No sé si está escondido en algún lugar o si alguien lo tiene ya escrito. Uno de los problemas es que el complemento de zona horaria actual parece mantener sus datos privados.
No quiero una solución basada en la integración de otra copia o extracto de las tablas de Olson (que tendría que mantener), sé que hay algunas bibliotecas que las duplican, quiero usar las que ya tengo en el momento .js.
Hay una herramienta de JavaScript que hace precisamente eso:
https://github.com/entraigas/jstz
Parece tratar también con la ambigüedad de las zonas horarias.
Combinado con momentJS timezone, puede obtener la zona horaria y mostrar la fecha formateada:
var tzObj = jstz.determine();
var timezoneCode = tzObj.name();
console.log(moment.tz(timeZoneCode).format());
Hice un pequeño script para hacer esa detección. Comienza registrando los identificadores de las zonas horarias disponibles, luego, en una llamada a la función de matches
, prueba todos los identificadores de zona horaria para la hora actual y los tiempos 4 y 8 meses más tarde (para filtrar las zonas horarias con diferentes reglas de luz natural) y cinco años antes de.
Aquí está :
<script src="moment-with-langs.min.js"></script>
<script src="moment-timezone.min.js"></script>
<script src="moment-timezone-data.js"></script>
<script>
var tzdetect = {
names: moment.tz.names(),
matches: function(base){
var results = [], now = Date.now(), makekey = function(id){
return [0, 4, 8, -5*12, 4-5*12, 8-5*12, 4-2*12, 8-2*12].map(function(months){
var m = moment(now + months*30*24*60*60*1000);
if (id) m.tz(id);
return m.format("DDHHmm");
}).join('' '');
}, lockey = makekey(base);
tzdetect.names.forEach(function(id){
if (makekey(id)===lockey) results.push(id);
});
return results;
}
};
</script>
Si solo quieres una identificación de zona horaria, simplemente usa
var tzid = tzdetect.matches()[0];
Repositorio GitHub: https://github.com/Canop/tzdetect.js
Actualización: el código aquí mostrado no es compatible con las versiones más recientes de moment.js. Consulte el repositorio de GitHub para obtener un código mantenido (de uso gratuito).
Actualización de 2017: ahora hay una API en moment.js para adivinar la zona horaria. Esa es probablemente la mejor solución en este momento.
Si desea utilizar la API JavaScript estándar, puede usar Intl.DateTimeFormat.resolvedOptions
donde hay compatibilidad con el navegador:
Intl.DateTimeFormat().resolvedOptions().timeZone; // "America/Los_Angeles"
resolvedOptions
es actualmente (enero de 2016) disponible en todos los navegadores excepto Safari en iOS y en el escritorio: http://caniuse.com/#feat=internationalization
Sin embargo, la propiedad timeZone
actualmente solo está disponible en Chrome .
momento ahora tiene la API de guess()
como se describe aquí