.net - utcnow - DateTime.ToLocalTime en Windows XP
get datetime timezone c# (2)
La documentación para el método .NET DateTime.ToLocalTime indica:
En los sistemas Windows XP, el método ToLocalTime solo reconoce la regla de ajuste actual al convertir de hora UTC a hora local. Como resultado, las conversiones de períodos anteriores a la entrada en vigencia de la regla de ajuste actual pueden no reflejar con precisión la diferencia entre el UTC y la hora local.
Estoy desarrollando en Windows 7 pero implementando en un entorno mixto. ¿Cómo puedo proporcionar una implementación coherente y correcta que coincida con el comportamiento de Windows 7 de ToLocalTime?
EDITAR
Ejecuté una prueba:
static void Main()
{
// 8 AM in July, UTC. That would have been DST, so 3 AM CDT.
var dstDate = new DateTime(2010, 7, 1, 8, 0, 0, DateTimeKind.Utc);
// 8 AM in December, UTC. Not DST, so 2 AM CST.
var nonDstDate = new DateTime(2010, 12, 1, 8, 0, 0, DateTimeKind.Utc);
Log("DST Date ToLocalTime: " + dstDate.ToLocalTime());
Log("DST Date ConvertTimeFromUtc: " + ConvertTimeFromUtc(dstDate));
Log("Expected: 3 AM July 1 2010");
Log(string.Empty);
Log("Non-DST Date ToLocalTime: " + nonDstDate.ToLocalTime());
Log("Non-DST Date ConvertTimeFromUtc: " + ConvertTimeFromUtc(nonDstDate));
Log("Expected: 2 AM December 1 2010");
Log(string.Empty);
Log("Date ToLocalTime Kind: " + dstDate.ToLocalTime().Kind);
Log("Date ConvertTimeFromUtc Kind: " + ConvertTimeFromUtc(dstDate).Kind);
}
private static void Log(string message)
{
Console.WriteLine(message);
}
private static DateTime ConvertTimeFromUtc(DateTime utcDateTime)
{
return
DateTime.SpecifyKind(
TimeZoneInfo.ConvertTimeFromUtc(
utcDateTime,
TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id)),
DateTimeKind.Local);
}
Los resultados fueron idénticos en XP Pro de 32 bits, SP3 (como VM) y Windows 7 Enterprise de 64 bits:
DST Date ToLocalTime: 7/1/2010 3:00:00 AM DST Date ConvertTimeFromUtc: 7/1/2010 3:00:00 AM Expected: 3 AM July 1 2010 Non-DST Date ToLocalTime: 12/1/2010 2:00:00 AM Non-DST Date ConvertTimeFromUtc: 12/1/2010 2:00:00 AM Expected: 2 AM December 1 2010 Date ToLocalTime Kind: Local Date ConvertTimeFromUtc Kind: Local
¿La documentación está equivocada? ¿Puedo simplemente llamar a ToLocalTime?
EDIT 2
Ejecutamos esto en un sistema de XP real (no en una VM) y obtuvimos resultados idénticos allí también. ¿Son correctos mis casos de prueba? ¿Alguien puede proporcionar un caso donde los resultados serán diferentes?
En los sistemas Windows XP, el método ToLocalTime solo reconoce la regla de ajuste actual al convertir de hora UTC a hora local. Como resultado, las conversiones de períodos anteriores a la entrada en vigencia de la regla de ajuste actual pueden no reflejar con precisión la diferencia entre el UTC y la hora local.
Estados Unidos cambió la regla de ajuste para el horario de verano en 2007.
- 2006: Comienza el primer domingo de abril y finaliza el último domingo de octubre.
- 2007: Comienza el segundo domingo de marzo, finaliza el primer domingo de noviembre.
El error es que están siguiendo las reglas de 2007 para todas las fechas, no solo las fechas posteriores a 2007. Las reglas de DST no habían cambiado en 20 años, Windows XP simplemente no tiene el concepto de reglas diferentes para años diferentes. Considerará que el 31 de octubre de 2006 está en Horario de verano, cuando en realidad no lo era.
Si solo estás lidiando con fechas posteriores a 2007, entonces eres bueno, no necesitas hacer nada especial. Si tiene fechas del 2006 o antes, deberá verificar el año y aplicar manualmente el desplazamiento del horario de verano.
Puede usar el método System.TimeZoneInfo.ConvertTime (DateTime, TimeZoneInfo, TimeZoneInfo) para convertir el tiempo de la zona horaria de la fuente a la zona horaria local del usuario.