2010-06-05 28 views
24

En la base de datos, almaceno todas las fechas/horas en UTC..NET Obtener el desplazamiento de zona horaria por nombre de zona horaria

Conozco el nombre de la zona horaria del usuario ("US Eastern Standard Time", por ejemplo).

Para mostrar la hora correcta, estaba pensando que tengo que agregar el desplazamiento de la zona horaria del usuario a la fecha/hora UTC. Pero, ¿cómo puedo obtener la zona horaria compensada por el nombre de la zona horaria?

¡Gracias!

Respuesta

37

Puede utilizar TimeZoneInfo.FindSystemTimeZoneById para obtener el objeto TimeZoneInfo usando el suministrado Id, entonces TimeZoneInfo.GetUtcOffset de que:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time"); 
TimeSpan offset = tzi.GetUtcOffset(myDateTime); 
+0

Esto resolvió mi problema. ¡Gracias! –

+0

Esto no parece funcionar para mí. Actualmente, es DST en la zona "E. Standard Time", por lo que su hora es GMT + 11. Sin embargo, cuando ejecuto esto obtengo un resultado de 10 horas. Debería ser 11. El código es: TimeZoneInfo.FindSystemTimeZoneById ("Hora estándar de Australia"). GetUtcOffset (Now.ToUniversalTime) .Hours. ¿Qué estoy haciendo mal? –

+0

@ ingredient_15939 - Posiblemente nada mal. ¿Comprobó que la computadora en la que se está ejecutando está configurada para usar DST correctamente? – Oded

4

Puede usar el método TimeZoneInfo de la clase GetSystemTimeZones() para buscar la lista de todas las zonas horarias configuradas en su servidor y hacerla coincidir con la de su cliente.

¿Por qué tienes zonas horarias en el formato "US Eastern Standard Time"? De donde vino eso?

+0

Gran idea, intentará ahora :) estoy poblando una gota abajo con la colección devuelta por GetSystemTimeZones() –

+0

En lugar de poblar el menú desplegable con el Id/cadena de cada objeto 'TimeZone' en la colección, ¿por qué no agregar los objetos reales en su lugar como 'Item's en el menú desplegable? De esta forma, cuando se cambia el menú desplegable, puede tomar una referencia al objeto TimeZoneInfo usando '(TimeZoneInfo) myDropDown.SelectedItem'. Entonces no necesitaría llamar' .FindSystemTimeZoneById' cada vez, ya tendría el objeto. –

2

En lugar de hacer alguna adición manual usted debe tomar ventaja del método de TimeZoneInfoConvertTime que se encargará de la conversión su fecha basada en el TimeZone que especifique.

var localizedDateTime = TimeZoneInfo.ConvertTime(yourDateTime, localTimeZoneInfo); 
+0

Excelente consejo. –