¿Cómo puedo reunir la información de zona horaria del visitante? Necesito la zona horaria, así como las horas de compensación GMT.
¿Cómo puedo reunir la información de zona horaria del visitante? Necesito la zona horaria, así como las horas de compensación GMT.
Respuestas:
var offset = new Date().getTimezoneOffset();
console.log(offset);
El desplazamiento de zona horaria es la diferencia, en minutos, entre la hora UTC y la hora local. Tenga en cuenta que esto significa que el desplazamiento es positivo si la zona horaria local está detrás de UTC y negativo si está adelante. Por ejemplo, si su zona horaria es UTC + 10 (hora estándar del este de Australia), se devolverá -600. El horario de verano evita que este valor sea constante incluso para un entorno local determinado
Tenga en cuenta que no todas las zonas horarias están compensadas por horas completas: por ejemplo, Terranova es UTC menos 3h 30m (dejando el horario de verano fuera de la ecuación).
getTimezoneOffset
imprecisión está vigente? El artículo al que se refiere está fechado en junio de 2007 y no tiene detalles de cómo la función es inexacta. Y, de hecho, la biblioteca jsTimezoneDetect
que apuntaste se usa getTimezoneOffset
sola.
var hrs = -(new Date().getTimezoneOffset() / 60)
para compensar en las horas que generalmente se usan
timezone
! =utc offset
Usar un desplazamiento para calcular la zona horaria es un enfoque incorrecto, y siempre encontrará problemas. Las zonas horarias y las reglas de horario de verano pueden cambiar en varias ocasiones durante un año, y es difícil mantenerse al día con los cambios.
Para obtener la zona horaria IANA del sistema en JavaScript, debe usar
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
ecma-402 / 1.0 dice que timeZone
puede estar indefinido si no se proporciona al constructor. Sin embargo, el borrador futuro (3.0) solucionó ese problema al cambiar a la zona horaria predeterminada del sistema.
En esta versión de la API de internacionalización ECMAScript, la
timeZone
propiedad permanecerá indefinida si notimeZone
se proporcionó ninguna propiedad en el objeto de opciones proporcionado alIntl.DateTimeFormat
constructor . Sin embargo, las aplicaciones no deben confiar en esto, ya que las versiones futuras pueden devolver un valor de cadena que identifica la zona horaria actual del entorno host.
en ecma-402 / 3.0, que todavía está en borrador, cambió a
En esta versión de la API de internacionalización ECMAScript 2015, la
timeZone
propiedad será el nombre de la zona horaria predeterminada si notimeZone
se proporcionó ninguna propiedad en el objeto de opciones proporcionado alIntl.DateTimeFormat
constructor. La versión anterior dejó latimeZone
propiedad indefinida en este caso.
Me doy cuenta de que esta respuesta está un poco fuera de tema, pero imagino que muchos de nosotros que buscamos una respuesta también queríamos formatear la zona horaria para mostrar y tal vez obtener la abreviatura de la zona también. Así que aquí va ...
Si desea que la zona horaria del cliente esté bien formateada, puede confiar en el método JavaScript Date.toString y hacer:
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
Esto le dará "GMT-0400 (EST)", por ejemplo, incluidos los minutos de la zona horaria cuando corresponda.
Alternativamente, con regex puede extraer cualquier parte deseada:
Para "GMT-0400 (EDT)":
new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]
Para "GMT-0400":
new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]
Por solo "EDT":
new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]
Por solo "-0400":
new Date().toString().match(/([-\+][0-9]+)\s/)[1]
Referencia de Date.toString: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
split[4] + " " + split[5]
.
split
contiene: ["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]
así que el resultado esDaylight Time)
new Date().toString()
depende completamente de la configuración regional. Esperar que los resultados de otros clientes se parezcan a los suyos es una muy mala idea.
Ya se ha respondido cómo obtener el desplazamiento en minutos como un entero, pero en caso de que alguien quiera el desplazamiento GMT local como una cadena, por ejemplo "+1130"
:
function pad(number, length){
var str = "" + number
while (str.length < length) {
str = '0'+str
}
return str
}
var offset = new Date().getTimezoneOffset()
offset = ((offset<0? '+':'-')+ // Note the reversed sign!
pad(parseInt(Math.abs(offset/60)), 2)+
pad(Math.abs(offset%60), 2))
pad(parseInt(Math.abs(offset/60)), 2)
Debe reemplazar el primer relleno con para hacerlo bien ... de lo contrario, podría terminar obteniendo +5,530 como en mi caso ... no estoy seguro de si el piso de matemáticas, etc., será algo mejor aquí o no ... pero esto al menos me da +0530 como se esperaba
Puedes usar:
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();
La detección de la zona horaria del navegador es bastante difícil de hacer, ya que el navegador proporciona poca información.
Moment Timezone utiliza Date.getTimezoneOffset()
y Date.toString()
en un puñado de momentos durante el año en curso para recopilar tanta información sobre el entorno del navegador como sea posible. Luego compara esa información con todos los datos de zona horaria cargados y devuelve la coincidencia más cercana. En caso de empate, se devuelve la zona horaria con la ciudad con mayor población.
console.log(moment.tz.guess()); // America/Chicago
Escribí una función en mi proyecto, que devuelve la zona horaria en hh:mm
formato. Espero que esto pueda ayudar a alguien:
function getTimeZone() {
var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}
// Outputs: +5:00
Una línea que proporciona el desplazamiento y la zona horaria es simplemente llamar a toTimeString () en un nuevo objeto Date. De MDN:
El
toTimeString()
método devuelve la parte de tiempo de un objeto Date en forma legible para humanos en inglés americano.
El problema es que la zona horaria no está en el formato estándar de la IANA; es algo más fácil de usar que el formato IANA "continente / ciudad" . Pruébalo:
console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);
En California en este momento, toTimeString()
regresa Pacific Daylight Time
mientras que la API Intl regresa America/Los_Angeles
. En Colombia, obtendrías Colombia Standard Time
vs.America/Bogota
.
Tenga en cuenta que muchas otras respuestas a esta pregunta intentan obtener la misma información llamando a Date.toString (). Ese enfoque no es tan confiable, como explica MDN :
Las instancias de fecha se refieren a un punto específico en el tiempo. Llamar a toString () devolverá la fecha formateada en un formato legible por humanos en inglés americano. [...] Algunas veces es deseable obtener una cadena de la porción de tiempo; tal cosa se puede lograr con el
toTimeString()
método.El
toTimeString()
método es especialmente útil porque los motores compatibles ejecución ECMA-262 pueden diferir en la secuencia obtenida a partirtoString()
deDate
los objetos, ya que el formato es dependiente de la implementación; Los enfoques simples de corte de cadenas pueden no producir resultados consistentes en múltiples motores.
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
Con moment.js :
moment().format('zz');
Z
yZZ
Con momentjs, puede encontrar la zona horaria actual como
console.log(moment().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
Con dayjs, puede encontrar la zona horaria actual como
console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/dayjs@1.8.10/dayjs.min.js"></script>
Ambas API devuelven utc offset en minutos.
getTimezoneOffset()
.
Zona horaria en horas
var offset = new Date().getTimezoneOffset();
if(offset<0)
console.log( "Your timezone is- GMT+" + (offset/-60));
else
console.log( "Your timezone is- GMT-" + offset/60);
Si quieres ser preciso como mencionaste en el comentario, entonces deberías intentar así:
var offset = new Date().getTimezoneOffset();
if(offset<0)
{
var extraZero = "";
if(-offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT+" + Math.ceil(offset/-60)+":"+extraZero+(-offset%60));
}
else
{
var extraZero = "";
if(offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT-" + Math.floor(offset/60)+":"+extraZero+(offset%60));
}
Si todo lo que necesita es la abreviatura de zona horaria "MST" o "EST":
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
return timeZone;
}
Date.toString()
no es confiable, y MDN explica por qué. He pegado la sección relevante de sus documentos en mi respuesta .
Vea que este operador resultante era opuesto a la zona horaria. Por lo tanto, aplique alguna función matemática y luego valide el número menos o más.
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
round
? Debería ser floor
, ¿no?
function getLocalTimeZone() {
var dd = new Date();
var ddStr = dd.toString();
var ddArr = ddStr.split(' ');
var tmznSTr = ddArr[5];
tmznSTr = tmznSTr.substring(3, tmznSTr.length);
return tmznSTr;
}
Ejemplo: jue 21 de junio de 2018 18:12:50 GMT + 0530 (hora estándar de India)
O / P: +0530
Date.toString()
no es confiable, y MDN explica por qué. He pegado la sección relevante de sus documentos en mi respuesta .
Prueba esto,
new Date().toString().split("GMT")[1].split(" (")[0]
Este valor es de la máquina del usuario y se puede cambiar en cualquier momento, así que creo que no importa, solo quiero obtener un valor aproximado y luego convertirlo a GMT en mi servidor.
Por ejemplo, soy de Taiwán y me devuelve "+8".
JS
function timezone() {
var offset = new Date().getTimezoneOffset();
var minutes = Math.abs(offset);
var hours = Math.floor(minutes / 60);
var prefix = offset < 0 ? "+" : "-";
return prefix+hours;
}
$('#result').html(timezone());
HTML
<div id="result"></div>
Resultado
+8
En el new Date(
) puede obtener el desplazamiento, para obtener el nombre de la zona horaria que puede hacer:
new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
obtienes el valor entre ()
al final de la fecha, ese es el nombre de la zona horaria.
Date.toString()
no es confiable, y MDN explica por qué. He pegado la sección relevante de sus documentos en mi respuesta . Además, esta respuesta ya se ha dado al menos 3 veces.
Esta sería mi solución:
// For time zone:
const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
// Offset hours:
const offsetHours = new Date().getTimezoneOffset() / 60;
console.log(`${timeZone}, ${offsetHours}hrs`);
Como alternativa a new Date().getTimezoneOffset()
y moment().format('zz')
, también puede usarmomentjs:
var offset = moment.parseZone(Date.now()).utcOffset() / 60
console.log(offset);
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
jstimezone también es bastante defectuoso y no se mantiene ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )
Use esto para convertir OffSet a positivo:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
Estaba buscando solo la cadena de 3 letras (como "PDT") y probé la respuesta de Márquez, pero tuve que ajustarla un poco para que fuera compatible con el navegador cruzado. Afortunadamente, la cadena es la última coincidencia potencial :)
Esto es lo que hice, en CoffeeScript:
browserTimezone = ->
userDate = new Date()
zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
userZone = zoneMatches[zoneMatches.length - 1]
Funciona en IE8, IE9, Safari 9, Firefox 44 y Chrome 48
Date.toString()
no es confiable, y MDN explica por qué. He pegado la sección relevante de sus documentos en mi respuesta .
Solo debes incluir moment.js y jstz.js
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>
y después de eso
<script>
$(function(){
var currentTimezone = jstz.determine();
var timezone = currentTimezone.name();
alert(timezone);
});
</script>
simplemente puedes probar esto. le devolverá el tiempo actual de la máquina
var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())
new Date(new Date().getTime());
mostraría: "Vie 28 de diciembre de 2018 10:15:23 GMT + 0100 (Hora estándar de Europa Central) {}"