2008-09-23 27 views
8

Mi base de datos se encuentra en, p. California. Mi tabla de usuario tiene toda la zona horaria del usuario, p. -0700 UTCAjustes de zona horaria de fecha y hora

¿Cómo puedo ajustar el tiempo de mi servidor de base de datos siempre que muestre una fecha al usuario que vive, p. ¿Nueva York? UTC/GMT -4 horas

Respuesta

4

Debe almacenar sus datos en formato UTC y mostrarlos en el formato de zona horaria local.

DateTime.ToUniversalTime() -> server; 
DateTime.ToLocalTime() -> client 

Puede ajustar la fecha/hora utilizando el grupo de métodos AddXXX, pero puede ser propenso a errores. .NET tiene soporte para zonas horarias en la clase System.TimeZoneInfo.

0

Hasta .NET 3.5 (VS 2008), .NET no tiene ningún soporte integrado para zonas horarias, además de la conversión hacia y desde UTC.

Si la diferencia de tiempo es siempre exactamente 3 horas todo el año de largo (verano e invierno), basta con utilizar yourDate.AddHours(3) para cambiar de una manera, y yourDate.AddHours(-3) volver a cambiarlo. Asegúrese de incluir esto en una función que explique el motivo de agregar/sustraer estas 3 horas.

0

Se puede usar una combinación de TimeZoneInfo.GetSystemTimeZones() y luego utilizar la propiedad TimeZoneInfo.BaseUtcOffset para compensar el tiempo en la base de datos basada en la diferencia de desplazamiento

Información sobre System.TimeZoneInfo here

0

Usted Sabe, esta es una buena pregunta. Este año he hecho mi primera aplicación DB y como mis datos de entrada relacionados con el tiempo son un valor Int64, eso es lo que guardé en DB. Mis aplicaciones cliente lo recuperan y hacen DateTime.FromUTC() o FromFileTimeUTC() en ese valor y hacen un .LocalTime() para mostrar cosas en su hora local. Me he preguntado si esto fue bueno/malo/terrible, pero hasta ahora ha funcionado lo suficientemente bien para mis necesidades. Por supuesto, el trabajo termina siendo realizado por una biblioteca de capa de acceso a datos que escribí y no en el propio DB.

Parece que funciona bien, pero confío en que otros que tengan más experiencia en este tipo de cosas puedan señalar que este no es el mejor enfoque.

¡Buena suerte!

2

Si usa .Net, puede usar TimeZoneInfo. Como etiquetó la pregunta con 'C#', asumiré que sí.

El primer paso es obtener el TimeZoneInfo para la zona horaria en la que desea realizar la conversión. En tu ejemplo, la zona horaria de NY. Aquí está una manera que puede hacerlo:

//This will get EST time zone 
TimeZoneInfo clientTimeZone 
    = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 

//This will get the local time zone, might be useful 
// if your application is a fat client 
TimeZoneInfo clientTimeZone = TimeZoneInfo.Local; 

Entonces, después de leer un DateTime de su base de datos, es necesario asegurarse de que su Kind está ajustada correctamente.Suponiendo que los DateTime 's en el PP están en UTC (por cierto, que generalmente se recomienda), puede prepararlo para ser convertido de esta manera:

DateTime aDateTime = dataBaseSource.ReadADateTime(); 
DateTime utcDateTime = DateTime.SpecifyKind(aDateTime, DateTimeKind.Utc); 

Por último, con el fin de convertir a una zona horaria diferente, simplemente hacer esto:

DateTime clientTime = TimeZoneInfo.ConvertTime(utcDateTime, clientTimeZone); 

Algunas observaciones adicionales:

  • TimeZoneInfo pueden ser almacenados en los campos estáticos, si usted está interesado sólo en unas pocas zonas horarias específicas;
  • TimeZoneInfo almacenar información sobre el horario de verano. Entonces, no tendrías que preocuparte por eso;
  • Si su aplicación es web, descubrir en qué zona horaria se encuentra su cliente puede ser difícil. Una forma se explica aquí: http://kohari.org/2009/06/15/automagic-time-localization/

Espero que esto ayude. :)

+0

Esto debe aceptarse como la respuesta –

Cuestiones relacionadas