2012-03-26 14 views
16

Trovo difficile capire come funziona UTC.Come convertire DateTime in un fuso orario specifico?

Devo fare quanto segue, ma sono ancora confuso se ottengo il risultato giusto.

Obiettivi:

  1. garantire che tutti i salvati sono date nel database in formato UTC
  2. aggiornamento DefaultTimezone è in tempo Manila
  3. garantire che tutti restituiti sono date in Time Manila

Così il il codice è:

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(); 
    } 
} 
utilizzo 0

Esempio:

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

Ora mi confondo per 'TimeZone'. Non so come usarlo per ottenere gli obiettivi.
Spero che tu capisca la mia domanda e abbia l'idea di realizzare gli obiettivi.

Modifica

Secondo la risposta @raveturned, ho questa seguente codice:

*** aggiunta nel metodo convertDate

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

** Nuova proprietà

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

Eventuali duplicati di http://stackoverflow.com/questions/246498/creating-a-datetime-in-a-specific-time-zone-in-c-sharp-fx-3-5 – Dotnet

risposta

40

Il framework .NET ha già clas ses e metodi disponibili per convertire DateTimes tra diversi fusi orari. Dai un'occhiata ai metodi ConvertTime della classe TimeZoneInfo.

Edit: Quando si arriva il momento di mettere nel database, ammesso che è stato creato con corrette informazioni sul fuso orario si può facilmente convertire in UTC:

DateTime utcTime = inputDateTime.ToUniversalTime(); 

Get timeInfo come fatto in Modifica domanda :

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

Quando si invia il tempo database per utente, convertirlo il fuso orario corretto con timeInfo.

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

Personalmente, proverei a mantenere questa logica separata dai metodi get/set appropriati.

+18

Questo [elenco degli ID di fuso orario] (http://stackoverflow.com/a/7908482/29) potrebbe essere utile –

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