Tengo la cadena de fecha UTC "2022-01-06T13:35:00Z" y la cadena de zona horaria "Romance Standard Time" . ¿Cómo puedo usar esa cadena de zona horaria en JavaScript (en un navegador) para que pueda corregir la hora a las 14:35 ?
Las bibliotecas de zona horaria que he encontrado hasta ahora usan la zona horaria de la IANA, por ejemplo, "Europe/Copenhagen" , por lo que una biblioteca que pueda convertir "Romance Standard Time" en algo como "Europe/Paris" también respondería a mi pregunta. Es aceptable que esta conversión se realice en .NET y no en JavaScript.
JavaScript
Si desea hacerlo con Javascript, hay varias bibliotecas. Estoy más familiarizado con moment.js , sin embargo, están en desuso, lo que significa que es posible que desee usar otra biblioteca si está trabajando en un nuevo proyecto.
Lista de bibliotecas sugeridas por moment.js .
De todos modos, si desea trabajar con momento y convertir a zonas horarias, puede hacerlo fácilmente usando Moment-Timezone . Todas las zonas horarias admitidas .
Por ejemplo:
const moment = require('moment-timezone'); const timeZone = "Europe/Paris"; const ISOString = "2022-01-06T13:35:00Z"; //2022-01-06T13:35:00Z const momentDefault = moment(ISOString).format(); //2022-01-06T14:35:00+01:00 const momentTz = moment.utc(ISOString).tz(timeZone).format(); //2022-01-06T14:35:00+01:00Como puede ver, moment obtiene la zona horaria de forma predeterminada y maneja ISOString como un valor UTC, por lo que convierte automáticamente el valor a la zona horaria del usuario del cliente.
Todavía puede indicar específicamente el momento para manejar ISOString como UTC ISOString y luego convertirlo a una zona horaria específica que definió. De esa forma se ignorará la zona horaria del cliente.
EDITAR: Ahora me di cuenta de que el interrogador quiere convertir la zona horaria de Windows a Iana antes de convertirla en Javascript, porque la mayoría de las bibliotecas, incluido Moment.js, no admiten las identificaciones de zona horaria de Windows.
Encontré una buena biblioteca aquí .
Y aquí hay un ejemplo de cómo convertir la zona horaria primero y luego usar moment.js.
import { findIana } from 'windows-iana'; const moment = require('moment-timezone'); const result = findIana('Romance Standard Time'); console.log(result); // ['Europe/Paris', 'Europe/Brussels', 'Europe/Copenhagen', 'Europe/Madrid', 'Africa/Ceuta'] const timeZone = result[0]; //doesn't really matter which one to take, if you are just converting the times. const ISOString = "2022-01-06T13:35:00Z"; //2022-01-06T13:35:00Z const momentDefault = moment(ISOString).format(); //2022-01-06T14:35:00+01:00 const momentTz = moment.utc(ISOString).tz(timeZone).format(); //2022-01-06T14:35:00+01:00.NET C#
Para convertir una hora a una zona horaria específica en C#, no necesita ningún paquete adicional, simplemente puede hacerlo de la siguiente manera:
var isoString = "2022-01-06T13:35:00Z"; var utcDate= DateTime.Parse(isoString); var timeZone = "Romance Standard Time"; var date = TimeZoneInfo.ConvertTime(utcDate, TimeZoneInfo.FindSystemTimeZoneById(timeZone)); //01/06/2022 14:35:00Aquí puede encontrar una lista de todos los timezoneId compatibles
La clave fue entender que "Romance Standard Time" es una ID de zona horaria de Windows . Todos los demás utilizan los ID de zona horaria de la IANA . Tienen el formato de región/ciudad, por ejemplo, "Europe/Copenhagen" .
En .NET 6 es posible convertir entre los formatos. Este es el ejemplo de código de Mejoras de fecha, hora y zona horaria en .NET 6 .
// Conversion from Windows to IANA when a region is unknown. string windowsTimeZoneId = "Eastern Standard Time"; if (!TimeZoneInfo.TryConvertWindowsIdToIanaId( windowsTimeZoneId, out string ianaTimeZoneId)) { throw new TimeZoneNotFoundException( $"No IANA time zone found for "{windowsTimeZoneId}"."); } Console.WriteLine($"{windowsTimeZoneId} => {ianaTimeZoneId}"); // "Eastern Standard Time => America/New_York" // Conversion from Windows to IANA when a region is known. string windowsTimeZoneId = "Eastern Standard Time"; string region = "CA"; // Canada if (!TimeZoneInfo.TryConvertWindowsIdToIanaId( windowsTimeZoneId, region, out string ianaTimeZoneId)) { throw new TimeZoneNotFoundException( $"No IANA time zone found for "{windowsTimeZoneId}" in "{region}"."); } Console.WriteLine($"{windowsTimeZoneId} + {region} => {ianaTimeZoneId}"); // "Eastern Standard Time + CA => America/Toronto"Si tiene una versión anterior de .NET, puede usar TimeZoneConverter . Aquí hay una lista completa de las zonas horarias en caso de que necesite crear su propio convertidor: windowsZones.json .
Esta respuesta a esta pregunta sugiere usar NodaTime, por lo que probablemente también sea una posibilidad: ¿Convertir la zona horaria de Windows en la zona horaria de moment.js?