Conversión de fecha y hora: dos tiempos no iguales al tiempo de inicio.
Estoy utilizando el paquete NuGet TimeZoneConverter.
La hora estándar del Pacífico se utiliza en UTC-8.
1. Se crea un datetime como zona horaria del Pacífico.
2. La hora del Pacífico se convierte a hora UTC.
3. La hora UTC se vuelve a convertir a la zona horaria del Pacífico. Pero el resultado no es igual al datetime del primer elemento. ¿Por qué? ¿Alguna idea?
[Fact]
public void DateTimeConvertTesting()
{
TimeZoneInfo pacificTimeZone = TZConvert.GetTimeZoneInfo("Pacific Standard Time"); // TimeZoneConverter
DateTimeOffset dateTimeOffsetPacific2 = new DateTimeOffset(2021, 09, 01, 11, 59, 0, pacificTimeZone.BaseUtcOffset);
DateTime utcDateTime = dateTimeOffsetPacific2.UtcDateTime;
DateTime pacificTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, pacificTimeZone);
Assert.True(dateTimeOffsetPacific2.DateTime == pacificTime);
}
davy.ai
Explicación de la conversión de DateTime utilizando el paquete NuGet TimeZoneConverter
En el escenario dado, necesitamos crear un objeto DateTime en la zona horaria del Pacífico, convertirlo a horario UTC y luego convertirlo nuevamente a la zona horaria del Pacífico. Aquí se está utilizando el paquete TimeZoneConverter para realizar estas conversiones.
Pasos a seguir:
Explicación de la falla de la afirmación:
La razón por la que los dos valores de fecha y hora no son iguales tiene que ver con la forma en que funciona el horario de verano. El horario estándar del Pacífico utiliza el horario de verano, lo que significa que la diferencia horaria con UTC cambia según la época del año. Específicamente, durante los meses de verano, la zona horaria es en realidad UTC-7 en lugar de UTC-8.
Cuando creamos la fecha y hora original (dateTimeOffsetPacific2), configuramos el BaseUtcOffset en UTC-8, lo cual corresponde al horario estándar cuando el horario de verano no está en efecto. Sin embargo, cuando convertimos esta fecha y hora a la hora UTC y luego nuevamente a la hora del Pacífico, la conversión utiliza la diferencia horaria actual con UTC, que es UTC-7 si el horario de verano está en efecto. Como resultado, la fecha y hora resultante (pacificTime) está una hora adelante de la fecha y hora original (dateTimeOffsetPacific2.DateTime), lo que hace que la afirmación falle.
Para solucionar este problema, debemos tener en cuenta el horario de verano al crear y convertir fechas y horas. Una forma de hacer esto es utilizar el método TimeZoneInfo.ConvertTime() en lugar de ConvertTimeFromUtc(). Este método toma como parámetros tanto la fecha y hora de entrada como la zona horaria de origen y la zona horaria de salida, y se ajusta automáticamente al horario de verano si es necesario.