Encontré muchas soluciones que dan el nombre de zona horaria a partir del valor de compensación. Pero tengo el nombre de la zona horaria y quiero un valor de compensación para eso. Probé setTimezone(‘Asia/Kolkata’), pero creo que no hay un método como setTimezone.
ejemplo:
Asia/Kolkata should give me -330 ( offset )
Esta es la forma más fácil de realizar esta tarea con JavaScript moderno.
Nota: Tenga en cuenta que la compensación depende de si el horario de verano (DST) está activo.
/* @return A timezone offset in minutes */
const getOffset = (timeZone="UTC", date = new Date()) => {
const utcDate = new Date(date.toLocaleString('en-US', { timeZone: 'UTC' }));
const tzDate = new Date(date.toLocaleString('en-US', { timeZone }));
return (tzDate.getTime() - utcDate.getTime()) / 6e4;
}
console.log(`No arguments: ${getOffset()}`); // 0
{
console.log('! Test Case #1 >> Now');
console.log(`Asia/Colombo : ${getOffset('Asia/Colombo')}`); // 330
console.log(`America/New_York : ${getOffset('America/New_York')}`); // -240
}
{
console.log('! Test Case #2 >> DST : off');
const date = new Date(2021, 0, 1);
console.log(`Asia/Colombo : ${getOffset('Asia/Colombo', date)}`); // 330
console.log(`America/New_York : ${getOffset('America/New_York', date)}`); // -300
}
{
console.log('! Test Case #3 >> DST : on');
const date = new Date(2021, 5, 1);
console.log(`Asia/Colombo : ${getOffset('Asia/Colombo', date)}`); // 330
console.log(`America/New_York : ${getOffset('America/New_York', date)}`); // -240
}
.as-console-wrapper { top: 0; max-height: 100% !important; }
baptiste higgs
Encontré este mismo problema, y esta es la solución que se me ocurrió, si puede obtener un Nombre de la base de datos IANA tz como el que mencionas:
const myTimezoneName = "Asia/Colombo";
// Generating the formatted text
// Setting the timeZoneName to longOffset will convert PDT to GMT-07:00
const options = {timeZone: myTimezoneName, timeZoneName: "longOffset"};
const dateText = Intl.DateTimeFormat([], options).format(new Date);
// Scraping the numbers we want from the text
// The default value '+0' is needed when the timezone is missing the number part. Ex. Africa/Bamako --> GMT
let timezoneString = dateText.split(" ")[1].slice(3) || '+0';
// Getting the offset
let timezoneOffset = parseInt(timezoneString.split(':')[0])*60;
// Checking for a minutes offset and adding if appropriate
if (timezoneString.includes(":")) {
timezoneOffset = timezoneOffset + parseInt(timezoneString.split(':')[1]);
}
no es muy lindo solución, pero hace el trabajo sin importar nada. Se basa en que el formato de salida de Intl.DateTimeFormat sea consistente, lo que debería ser, pero esa es una advertencia potencial.
-
¡Gracias! Después de mucho buscar, finalmente encontré mi respuesta aquí. Muy apreciado.
– Armando
1 de julio de 2021 a las 12:48
-
Tenga en cuenta que no siempre funcionará porque en formato “breve” algunas zonas horarias se representan por su nombre como “PST” en lugar de su desplazamiento. El mejor enfoque sería imprimir la zona horaria en formato “shortOffset”, pero esta opción no es compatible con Node.js.
– Alexander Korostin
16 de enero de 2022 a las 21:43
-
Node.js ahora admite las opciones “shortOffset” y “longOffset” para timeZoneName.
– diacodelico
24 de junio de 2022 a las 2:22
-
Buena respuesta. Sin embargo, necesita un ajuste. La línea que limita el número del texto no funciona para las zonas horarias que se resuelven en GMT en lugar de GMT+0. Actualizaré la respuesta para agregar una solución.
– asiby
24 de junio de 2022 a las 15:19
-
@AlexanderKorostin, usar “longOffset” como formato de zona horaria lo resolverá. He editado la respuesta nuevamente para abordar eso.
– asiby
24 de junio de 2022 a las 16:41
Matt Johnson-pinta
No se puede obtener sólo por su nombre. También necesitaría saber la hora específica. Asia/Kolkata
puede fijarse en un solo desplazamiento, pero muchas zonas horarias alternan entre el horario estándar y el horario de verano, por lo que no puede simplemente obtener el compensación, sólo puede obtener un compensar.
Para saber cómo hacerlo en JavaScript, vea esta respuesta.
nathan dullea
Usando países y zonas horarias paquete npm:
import {getTimezone} from 'countries-and-timezones';
const australianTimezone="Australia/Melbourne";
console.log(getTimezone(australianTimezone));
Imprime en la consola:
{
name: 'Australia/Melbourne',
country: 'AU',
utcOffset: 600,
utcOffsetStr: '+10:00',
dstOffset: 660,
dstOffsetStr: '+11:00',
aliasOf: null
}
A partir de ahí, puede usar utcOffset o dstOffset según sea el horario de verano.
has probado momentojs.com ?
-Anto Subash
24 de enero de 2014 a las 8:20
Déjame ver si he entendido tu situación. Tiene un timezeon A y desea obtener la diferencia horaria entre otra zona horaria B. Mi pregunta es … su variable son las dos zonas horarias, por lo tanto, ¿ambas zonas horarias cambiarán con frecuencia? o solo una de esta zona horaria puede cambiar, por ejemplo, hay un cliente con una zona horaria y solo uno para saber la diferencia horaria entre el cliente y su servidor.
– usuario688877
24/01/2014 a las 11:40
solo cambiará una zona horaria… La zona horaria del servidor es UTC 0. Cuando la zona horaria del cliente es Asia/Kolkata, en ese caso quiero una compensación de esa zona horaria (significa -330 minutos).
– Hardik Sondagar
25 de enero de 2014 a las 9:49