Recibí la siguiente cadena: "2022/05/01 03:10:00" y necesito crear un objeto de fecha que lo obligue a usar la compensación UTC de Chile.
El problema es que debido al horario de verano (DST), la compensación cambia dos veces al año.
¿Cómo se puede obtener ese objeto Fecha, por ejemplo, usando el nombre TZ db "América/Santiago"?
Algo como:
new Date("2022/05/01 03:10:00" + getUtcOffset("America/Santiago")) .
function getUtcOffset(tzDbName) { .. }Devuelve -3 o -4, dependiendo de la época del año.
EDITAR:
Terminé usando un buen truco para determinar si DST estaba activado o desactivado. referencia
const dst = hasDST(new Date(strDate)); function hasDST(date = new Date()) { const january = new Date(date.getFullYear(), 0, 1).getTimezoneOffset(); const july = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); return Math.max(january, july) !== date.getTimezoneOffset();}
Entonces podría crear la fecha con la zona horaria correcta dependiendo de esa variable.
if (dst) { let d = new Date(strDate + " GMT-0300"); return d; } else { let d = new Date(strDate + " GMT-0400"); return d; }¡Gracias a todos!
EDIT2: finalmente encontré una biblioteca muy agradable que hace exactamente lo que estaba buscando:
https://date-fns.org/v2.28.0/docs/Time-Zones#date-fns-tz
const { zonedTimeToUtc, utcToZonedTime, format } = require('date-fns-tz') const utcDate = zonedTimeToUtc('2022-05-05 18:05', 'America/Santiago')Esto ha sido discutido antes aquí . No lo he probado, pero parece que la solución más simple es:
// Example for Indian time let indianTime = new Date().toLocaleTimeString("en-US", {timeZone:'Asia/Kolkata',timestyle:'full',hourCycle:'h24'}) console.log(indianTime)Puede consultar el enlace para obtener respuestas y bibliotecas más complejas.
Notas generales Para obtener el nombre de la zona horaria, utilice:
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)Para obtener la diferencia de UTC (en minutos) use:
var offset = new Date().getTimezoneOffset(); console.log(offset); // if offset equals -60 then the time zone offset is UTC+01