2009-06-08 14 views
10

Necesito tener una función común para convertir la hora UTC a EDT. Tengo un servidor en India. Una aplicación necesita usar el tiempo EDT para todos los tiempos.¿Cómo convertir el tiempo entre zonas horarias (UTC a EDT)?

Estoy usando .NET 3.5.

Encontré este en algún otro foro.

DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
     DateTime.UtcNow, "Eastern Standard Time"); 

Cuando probé con "Easten Daylight Time" recibí un error.

"No se encontró la ID de zona horaria 'Eastern Daylight Time' en la computadora local".

Ayuda con esta u otra solución.

Respuesta

22

Eastern Daylight Time no es el nombre de una zona horaria "completa": es "la mitad" de un huso horario, efectivamente, siempre 4 horas detrás de UTC. (Puede haber una terminología adecuada para esto, pero no lo conozco).

¿Por qué le gustaría usar EDT para los horarios en los que no se aplica el horario de verano? Si desea una zona horaria personalizada que siempre tenga el mismo desplazamiento a UTC, use TimeZoneInfo.CreateCustomTimeZone.

Tenga en cuenta que si utiliza obtener la zona horaria estándar del este (TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")) entonces que todavía tendrá el horario de verano se aplica apropiadamente (es decir, durante el verano).

Por ejemplo:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 

// Prints True 
Console.WriteLine(tzi.IsDaylightSavingTime(new DateTime(2009, 6, 1))); 
// Prints False 
Console.WriteLine(tzi.IsDaylightSavingTime(new DateTime(2009, 1, 1))); 
+0

Hola Jon, gracias por tu respuesta. ¿Qué sugieres como la mejor solución de estos 2? ¿Debería crear una zona horaria personalizada o usar TimeZoneInfo.FindSystemTimeZoneById ("Eastern Standard Time")? Considering que se encargará del horario de verano. ¿Y cómo me ocupo de este problema en los procedimientos almacenados que usan el método getdate() y toman el tiempo IST? – Shetty

+0

No sé acerca de los procedimientos almacenados, para ser honesto, si es posible, pase UTC en ellos y hágales comprender UTC. En cuanto a si debe usar un huso horario personalizado de Eastern Standard Time, depende de si desea un huso horario que * siempre * esté 4 horas atrás de UTC, o uno que coincida con el horario estándar del este. Originalmente declaró que necesitaba usar EDT "para todos los propósitos": le sugiero que compruebe si realmente * necesita EDT o si necesita Eastern Standard Time. –

+0

Ok Jon. Se me solicitó utilizar el horario de la ciudad de * Boston * como hora estándar para todos los fines del tiempo, lo que corresponde a EDT. No era muy consciente del ahorro de luz diurna. Quería que mi aplicación tomara esta vez aunque se ejecute en el servidor IST. Anteriormente estaba en un servidor diferente que se estaba ejecutando en la zona horaria EDT y no tuve tales problemas. – Shetty

1

habría dicho que se debe utilizar para el cálculo de UTC períodos de tiempo, para que evitar problemas de horario de verano y luego usar LocalTime por sólo pantalla.

DateTime.ToLocalTime para UTC, cualquiera que sea la zona horaria local, y luego DateTime.ToUniversalTime para convertir la hora local a UTC.

Edición después de 1 comentario

lo tomo entonces que lo que busca es mostrar una zona horaria diferente a la del servidor?

Si está utilizando páginas web para acceder a su servidor, utilice HttpRequest.UserLanguages ​​para ayudarlo a crear un objeto CultureInfo y usarlo para analizar su objeto DateTime. Busque aquí una explicación completa: Microsoft link on displaying local user time for web pages.

Si está utilizando una arquitectura de cliente-servidor, si la llamada de LocalTime está en el lado del cliente, mostrará LocalTime para el cliente. Luego lo convierte a UTC para enviar de vuelta a su servidor.

De cualquier forma, su servidor no necesita saber dónde está el cliente, de modo que si tiene varios clientes en múltiples zonas horarias, todos los cálculos coincidirán. También le permitirá mostrar los horarios en cualquier zona horaria que desee mediante el uso de diferentes objetos de Cultura.

Editar 2 copiado mi segundo comentario

Usted puede obtener los datos de tiempo en formato GMT desde el servidor. Luego puede convertirlo usando DateTime.ToLocalTime o DateTime.ToUniversalTime como se solicitó. Si también incluye fechas y necesita lidiar con los formatos MM/dd/aaaa y dd/MM/aaaa de los Estados Unidos, puede usar la clase CultureInfo para analizar el valor de DateTime en consecuencia. Suena como más trabajo de lo que tiene en este momento, pero significaría que si mueve su servidor nuevamente, entonces no necesita recodificar el manejo de DateTime.

Un nuevo punto de

Otro punto a tener en cuenta es la sincronización de reloj entre el servidor y los clientes utilizando NTP (Network Time Protocol) o SNTP (Simple Network Time Protocol) si es lo suficientemente precisa. No sé qué sistema operativo está utilizando, pero los servicios horarios de Windows Server lo utilizan para sincronizar redes.

+0

Hola Chris, Gracias por su respuesta. Si no me equivoco, si el servidor se está ejecutando en el huso horario IST, Datetime.ToLoalTime de UTC dará tiempo en IST. ¿No es así? – Shetty

+0

Es cierto. He editado mi respuesta. Explicar cómo LocalTime emite el código Cliente-servidor y también los indicadores para mostrar la hora local para los usuarios de la web. – ChrisBD

+0

Hola Chris, lo hiciste bien. Estoy mostrando una zona horaria diferente a la del servidor. Es una arquitectura de servidor cliente. Pero no quiero confiar en el tiempo del sistema cliente porque todos los tiempos de la máquina cliente pueden no ser exactamente los mismos. donde si usa el tiempo del servidor, sería uniforme para todos los clientes. – Shetty

0

El método cowboy consiste en tomar la hora UTC, restar cuatro horas de segundos de ella (la zona horaria compensada), formatearla utilizando una función de formateo UTC e introducir una etiqueta "EDT" en ella.

Si necesita usar el horario de verano a veces y el horario estándar otras veces, haga una tabla de búsqueda de las fechas de cambio, o use alguna función de calendario.

Cuestiones relacionadas