1 respuesta

La mejor respuesta

Su enfoque sugerido es defectuoso porque el desplazamiento actual del navegador del cliente solo se aplicará a la fecha y hora actual . En realidad, las compensaciones de zona horaria cambian con el tiempo dentro de una zona horaria determinada. No puede simplemente tomar un desplazamiento singular de un punto en el tiempo y esperar usarlo para convertir otras fechas y horas a la misma zona horaria. En su lugar, debe utilizar la cadena que identifica la zona horaria , no un desplazamiento de esa zona.

Como ejemplo, considere la zona horaria del este de los Estados Unidos. Durante parte del año, usa UTC-5 y lo llamamos Hora estándar del este (EST). En otra parte del año, usa UTC-4, y lo llamamos Hora de verano del Este (EDT). Esta zona horaria se identifica mediante el ID de zona horaria de IANA "America/New_York" o el ID de zona horaria de Windows "Eastern Standard Time" (que cubre toda la zona, tanto EST como EDT a pesar de su redacción).

Entonces, divida este problema en unos pocos pasos:

  1. En JavaScript, identifique la zona horaria de IANA de los usuarios (America/New_York):

    • Si está orientado a navegadores web modernos, puede llamar a esta función:

       Intl.DateTimeFormat().resolvedOptions().timeZone
       
    • Si necesita admitir navegadores web más antiguos, puede usar jsTimeZoneDetect o { {X1}} de Moment-Timezone.

  2. Envíe esa cadena a su servidor web a través de cualquier mecanismo que desee (publicación de formulario, XHR, recuperación, etc.)

  3. En su código .NET, reciba esa cadena y utilícela para hacer referencia a la zona horaria y realizar la conversión. Tienes dos opciones:

    • Puede usar Noda Time, pasando el ID de zona horaria de IANA a DateTimeZoneProviders.Tzdb como que se muestra en el ejemplo de la página de inicio.

    • Puede utilizar el objeto TimeZoneInfo integrado de .NET. Si está ejecutando .NET Core en sistemas que no son Windows (Linux, OSX, etc.), puede simplemente pasar el ID de zona horaria de IANA a TimeZoneInfo.FindSystemTimeZoneById. Si está en Windows, primero deberá convertirlo a un ID de zona horaria de Windows ("Eastern Standard Time"). Puede usar TZConvert.GetTimeZoneInfo de mi biblioteca TimeZoneConverter.

  4. Una vez que tenga un objeto DateTimeZone de Noda Time, o un objeto TimeZoneInfo, puede usar los métodos en él para convertir los valores UTC a los valores de la hora local para esa zona horaria. Cada uno de estos aplicará el desplazamiento correcto para el momento en el que se está convirtiendo.

También diré que muchas aplicaciones simplemente le piden al usuario que elija su zona horaria de una lista desplegable y la guarde en un perfil de usuario. Siempre que esté almacenando una cadena de identificador de zona horaria y no solo un desplazamiento numérico, este enfoque es perfectamente aceptable para reemplazar los pasos 1 y 2 anteriores.

2
Matt Johnson-Pint 4 ago. 2020 a las 18:10