2011-02-10 13 views
5

La documentación de los estados .NET DateTime.ToLocalTime método:DateTime.ToLocalTime en Windows XP

En los sistemas Windows XP, el ToLocalTime método reconoce sólo la regla de ajuste de corriente al convertir de UTC a la hora local. Como resultado, las conversiones para períodos anteriores a la regla de ajuste actual entraron en , el efecto puede no reflejar con exactitud la diferencia entre la hora 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

me hizo 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éntica bajo XP Pro 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 es incorrecta? ¿Puedo simplemente llamar a ToLocalTime?

EDIT 2

nos encontramos con esto en un sistema XP real (no una máquina virtual) y nos dieron resultados idénticos allí también. ¿Son correctos mis casos de prueba? ¿Alguien puede proporcionar un caso donde los resultados serán diferentes?

Respuesta

5

En los sistemas Windows XP, el método ToLocalTime reconoce sólo la corriente regla de ajuste al convertir de UTC a la hora local. Como resultado, las conversiones para períodos anteriores a la regla de ajuste actual entraron en , el efecto puede no reflejar con exactitud la diferencia entre la hora UTC y la hora local.

Estados Unidos cambió la regla de ajuste de horario de verano en 2007.

  • 2006: Comienzo primero domingo de abril, Fin último domingo de octubre.
  • 2007: Comienza el segundo domingo de marzo y 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 han cambiado en 20 años, Windows XP simplemente no tiene el concepto de reglas diferentes por diferentes años. Considerará que el 31 de octubre de 2006 está en Horario de verano, cuando en realidad no lo era.

Si solo está lidiando con fechas posteriores a 2007, entonces está bien, sin necesidad de hacer nada especial. Si tiene fechas del 2006 o antes, deberá verificar el año y aplicar manualmente el desplazamiento del horario de verano.

+0

¡Aargh! Pensé que querían decir "debería aplicar el ajuste del horario de verano AHORA MISMO" cuando hablaron sobre las reglas de ajuste. Acabo de encontrar este [enlace] (http://www.techrepublic.com/article/what-net-developers-need-to-know-about-daylight-saving-time-changes/6160501) que dice que estás en lo correcto . ¡Gracias! – TrueWill

1

Puede utilizar 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.

+0

+1 por señalarme en la dirección correcta, pero esto es solo la mitad de la respuesta. Encontré las notas de WinXP en [link] (http://msdn.microsoft.com/en-us/library/system.timezoneinfo.local.aspx). Tal vez 'TimeZoneInfo.ConvertTimeFromUtc (utcDate, TimeZoneInfo.FindSystemTimeZoneById (TimeZoneInfo.Local.Id))' – TrueWill

Cuestiones relacionadas