2012-07-03 9 views
12

¿C# toma en cuenta el horario de verano cuando se convierte entre zonas horarias?¿TimeZoneInfo toma DST en consideración?

Tengo una fecha de origen que está en la hora actual en Londres, y quiero convertirla a mi zona horaria (CET). Aquí está el código que estoy usando.

DateTime time = DateTime.ParseExact(timeString, "HH:mm", null); 
time = DateTime.SpecifyKind(time, DateTimeKind.Unspecified); 

//Convert it to the right timezone. It is currently in GMT 

TimeZoneInfo gmt = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
TimeZoneInfo current = TimeZoneInfo.Local; 

DateTime utc = TimeZoneInfo.ConvertTimeToUtc(time, gmt); 
DateTime local = TimeZoneInfo.ConvertTimeFromUtc(utc, core.startTime = local; 

Actualmente funciona bien. Sin embargo, cuando el DST muestre su fea cabeza, ¿continuará funcionando o se romperá horriblemente? Soy un poco cauteloso con TimeZones debido a que tuve muchos problemas en el pasado.

+1

Te das cuenta de que Londres no está en GMT, ¿verdad? Como ahora es verano en el hemisferio norte, Londres está en UTC + 1 mientras estás en UTC + 2. – Gabe

+0

¿Ves cuál es mi problema? No quiero marcarlo como BST (que es la hora actual) porque cuando deja de ser BST regresa a GMT. Espero que sea automático. ODIO las zonas horarias. – Aabela

+0

Afortunadamente para ti, automáticamente usará BST por momentos en el verano y GMT por momentos en el invierno. Tiene razón en que 'TimeZone' tiene problemas, pero eso es lo que' TimeZoneInfo' se creó. – Gabe

Respuesta

1

TimeZoneInfo.GetAdjustmentRules le dará una colección de reglas sobre los cambios en el desplazamiento DST y cuándo entran y salen de efecto.

Sin embargo, su usuario puede seguir molestando al desmarcar la opción "Ajustar automáticamente para el horario de verano" en la fecha y hora del panel de control de Windows. Si el horario de verano está desactivado en Windows, obtendrá una colección vacía de reglas de ajuste.

Si desea la aplicación automática de reglas de ajuste, debe utilizar objetos DateTime para los que se haya configurado DateTimeKind. Si el horario de verano está desactivado, esto se respetará en la conversión.

GMT es hora solar en el Observatorio Real de Greenwich. Los británicos inventaron todo el negocio de las compensaciones de zonas horarias desde una línea de fecha porque fueron los primeros en coordinar cualquier cosa a escala global. En los días felices de antaño tenían una flota de veleros de todo el planeta y no tenían radio. La demora en los pedidos fue de semanas o meses, por lo que las únicas personas con un marco de referencia más grande que un planeta, los Royal Astronomers, inventaron el tiempo global constante y preciso.

Las fuerzas de marea de la luna están ralentizando la rotación de la Tierra. Se necesita mucho jugo para derramar un océano de agua hacia arriba y hacia abajo y no es magia, proviene del momento del giro del planeta.

También la duración de una órbita solar tampoco es constante, por lo que tenemos segundos intercalares de vez en cuando para sincronizar el calendario con la realidad planetaria. El tiempo sidéreo, por otro lado, no tiene tal necedad, así que nos alejamos de él. Luego está la deriva relativista. Los satélites GPS se mueven tan rápido que en realidad tienen que compensar el ligero desvío de tiempo.

+0

¿Lo entiendo correctamente como "No, tendrá que escribir el código para verificarlo usted mismo"? ¿O es automático? – Aabela

+0

No, tendrá que escribir el código para verificarlo usted mismo –

+0

Por mucho que las fuerzas de marea estén ralentizando el planeta, esto no responde con precisión a la pregunta: "¿TimeZoneInfo tiene en cuenta el horario de verano?" a lo que la respuesta es en realidad: "Sí y no necesita escribir ningún código para esto usted mismo, al menos en .net 4.5". – pasx

0

¿C tiene en cuenta el horario de verano cuando se convierte entre husos horarios?

Sí, suponiendo que su computadora se mantiene actualizada ya que la información de la zona horaria a veces se actualiza con la actualización de Windows. Todavía debería funcionar incluso sin la actualización de Windows si el país no ha cambiado sus períodos de horario de verano (esto sucedió en Australia recientemente)

Tengo una fecha de origen que es la hora actual en Londres, y quiero convertirlo a mi zona horaria (CET)

¿Qué quieres decir con 'fecha de origen, cuál es la hora actual en Londres'? Siempre guarde sus fechas como UTC y conviértalas 'en el último minuto' a la hora local deseada.

Si se pregunta qué sucede cuando cambia el horario de verano, puede probar esto cambiando el reloj de su computadora.

+1

Significa que estoy obteniendo la fecha de un proveedor que me está dando tiempo en Londres, y necesito normalizarlo con otra fecha de un proveedor que me lo da en mi zona horaria local Intento evitar estos problemas, pero a veces no hay nada que hacer. No quiero cambiar el reloj para averiguarlo porque la última vez que lo hice muchas cosas salieron mal con las referencias de proyectos por alguna razón (algo que ver con los tiempos de compilación). – Aabela

+0

@Aabela que no es razón suficiente para no cambiar su reloj en su computadora. usted es el dueño de su computadora. cambia el reloj, prueba, luego cámbialo. puedes limpiar tu solución (en el menú Compilar) que debería corregir eso. Si todavía está preocupado, pruébelo en una máquina virtual – wal

+0

, debe convertir ambos tiempos en UTC y trabajar con ellos en UTC. – wal

0

Al menos en .net 4.5 TimeZoneInfo maneja el horario de verano.

La forma más fácil de comprobarlo es comparar BaseUtcOffset y GetUtcOffset

var baseOffset = timeZoneInfo.BaseUtcOffset; 
    var currentOffset = timeZoneInfo.GetUtcOffset(currentLocalTime); 
    var isDst = currentOffset > baseOffset; 
    var delta = currentOffset - baseOffset; 

Esto es mucho más fácil que tratar con AdjustmentRule el que no es necesario si usted está interesado sólo en el ajuste de un DateTime para el horario de verano.

Btw GMT está obsoleto y se sustituye por UTC.

Cuestiones relacionadas