2012-03-26 21 views
16

Me resulta difícil entender cómo funciona UTC.Cómo convertir DateTime en zona horaria específica?

Tengo que hacer lo siguiente, pero aún estoy confundido si obtengo el resultado correcto.

Objetivos:

  1. Asegurar que todos guardan fechas en la base de datos están en formato GMT
  2. actualización Defaulttimezone está en el tiempo de Manila
  3. asegurar que todos regresaron las fechas están en Tiempo Manila

Así que la el código es:

public ConvertDate(DateTime? dateTime) 
{ 
    if (dateTime != null) 
    { 
     Value = (DateTime)dateTime; 
     TimeZone = GetFromConfig.DefaultTimeZone(); 
    } 
} 


public ConvertDate(DateTime? dateTime, int GMTTimeZone) 
{ 
    if (dateTime != null) 
    { 
     Value = (DateTime)dateTime; 
     TimeZone = GMTTimeZone; 
    } 
} 


public int TimeZone 
{ 
    get { return m_TimeZone; } 
    set { m_TimeZone = value; } 
} 


DateTime m_Value; 
public DateTime Value 
{ 
    get { return m_Value; } 
    set 
    { 
     m_Value = value; 
     DateTime converted = m_Value.ToUniversalTime().ToLocalTime(); 
    } 
} 

el uso de la muestra:

DateTime SampleInputFromUser = new DateTime(2012, 1, 22); 
ConvertDate newConversion = new ConvertDate(SampleInputFromUser, 21); 
DateTime answer = newConversion.Value; 

Ahora se confunden para 'zona horaria'. No sé cómo usarlo para obtener los objetivos.
Espero que comprenda mi pregunta y tenga la idea de lograr los objetivos.

Editar

Según la respuesta @raveturned, consigo este siguiente código:

*** Añadido en el método convertDate

TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(GetFromConfig.ManilaTimeZoneKey()); 
ManilaTime = TimeZoneInfo.ConvertTime(dateTime.Value, TimeZoneInfo.Local, timeInfo).ToUniversalTime(); 

** Nueva Propiedad

DateTime _ManilaTime; 
public DateTime ManilaTime 
{ 
    get { return _ManilaTime; } 
    set { _ManilaTime = value; } 
} 
+0

duplicado Posible de http://stackoverflow.com/questions/246498/creating-a-datetime-in-a-specific-time-zone-in-c-sharp-fx-3-5 – Dotnet

Respuesta

40

El .NET framework ya tiene clas ses y métodos disponibles para convertir DateTimes entre diferentes zonas horarias. Eche un vistazo a los métodos ConvertTime de la clase TimeZoneInfo.

Editar: Cuando llegue el momento de poner en la base de datos, suponiendo que fue creado con información de zona horaria correcta se puede convertir fácilmente a UTC:

DateTime utcTime = inputDateTime.ToUniversalTime(); 

Obtener timeInfo como se hace en la cuestión de edición :

TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(GetFromConfig.ManilaTimeZoneKey()); 

al enviar el tiempo de la base de datos de usuario, convertirlo a la zona horaria correcta utilizando timeInfo.

DateTime userTime = TimeZoneInfo.ConvertTimeFromUtc(dbDateTime, timeInfo); 

Personalmente, trataría de mantener esta lógica separada de los métodos proper get/set.

+18

Este [lista de ID de zona horaria] (http://stackoverflow.com/a/7908482/29) podría ser útil –

3
TimeZoneInfo infotime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time (Mexico)"); 
DateTime thisDate = TimeZoneInfo.ConvertTimeFromUtc(datetimeFromBD, infotime); 
Cuestiones relacionadas