Un ejemplo sería las 9 a. m. CST (hora central estándar) o las 6 a. m. CET (hora central europea).
El uso de cualquier nueva llamada Date() siempre me dará una fecha en mi zona horaria local (BST o GMT+1).
Creo que primero necesito crear la fecha en la zona horaria deseada, ¿no?
function convertToUTC(date, tzString) { // some code? } let resp = convertToUTC("2022-07-12 09:00:00", "America/Chicago"); console.log(resp) should be "2022-07-12T14:00:00Z"Basado en la documentación de MDN .
console.log(new Intl.DateTimeFormat('en-GB', { dateStyle: 'full', timeStyle: 'long' }).format(date));Esto generará
// Expected output "Sunday, 20 December 2020 at 14:23:16 GMT+11"Hay muchas opciones y muchos lugares. Puedes consultarlos todos aquí .
Definitivamente sugeriría usar una biblioteca de fecha/hora especializada para este propósito.
La conversión de zona horaria en JavaScript estándar es complicada, por decir lo mínimo (especialmente la conversión de una zona horaria a UTC)
Sin embargo, esto es bastante sencillo en luxon :
Estoy usando la función DateTime.fromSQL() aquí ya que coincide con el formato de marca de tiempo de entrada.
const { DateTime } = luxon; function convertToUTC(date, tzString) { const dt = DateTime.fromSQL(date, { zone: tzString }); return dt.setZone('UTC'); } console.log(convertToUTC("2022-07-12 09:00:00", "America/Chicago")); console.log(convertToUTC("2022-07-12 09:00:00", "America/Los_Angeles")); console.log(convertToUTC("2022-07-12 09:00:00", "Europe/London")); .as-console-wrapper { max-height: 100% !important; } <script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/2.3.1/luxon.min.js" integrity="sha512-Nw0Abk+Ywwk5FzYTxtB70/xJRiCI0S2ORbXI3VBlFpKJ44LM6cW2WxIIolyKEOxOuMI90GIfXdlZRJepu7cczA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>Podemos hacer esto en JavaScript estándar, es un poco incómodo.
Básicamente, estamos buscando la fecha UTC que, cuando se convierta a la zona horaria de destino, será igual a la fecha de destino.
Estoy usando la configuración regional 'sv' ya que nos dará las marcas de tiempo ISO.
function convertToUTC(date, tzString) { const dt = Date.parse(toIso(date) + 'Z'); for(let offsetMinutes = -840; offsetMinutes <= 660; offsetMinutes += 15) { const utc = new Date(dt + offsetMinutes * 60000); if (toIso(date) === toIso(utc, tzString)) { return toIso(utc, 'UTC') + 'Z'; } } } function toIso(date, timeZone) { return new Date(date).toLocaleString('sv', { timeZone }).replace(' ', 'T'); } console.log(convertToUTC("2022-07-12 09:00:00", "America/Chicago")); console.log(convertToUTC("2022-07-12 09:00:00", "America/Los_Angeles")); console.log(convertToUTC("2022-07-12 09:00:00", "Europe/London")); .as-console-wrapper { max-height: 100% !important; }