2012-03-26 9 views
16

Trudno jest zrozumieć, jak działa UTC.Jak przekonwertować DateTime w określonej strefie czasowej?

Muszę wykonać następujące czynności, ale nadal jestem zdezorientowany, jeśli uzyskam właściwy wynik.

Cele:

  1. zapewnienia, że ​​wszystkie zapisane terminy w bazie są w formacie UTC
  2. Aktualizacja DefaultTimezone jest w czasie Manila
  3. zapewnić wszystkich zwrócone terminy są w Czasie Manila

Tak kod:

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

Przykład użycia:

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

Teraz jestem zdezorientowany z powodu "strefy czasowej". Nie wiem, jak go użyć, aby osiągnąć cele.
Mam nadzieję, że rozumiesz moje pytanie i mam pomysł, aby osiągnąć założone cele.

Edit

Według odpowiedź @raveturned, otrzymuję ten poniższy kod:

*** Dodane w metodzie ConvertDate

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

** New Property

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

Możliwy duplikat http://stackoverflow.com/questions/246498/creating-a-datetime-in-a-specific-time-zone-in-c-sharp-fx-3-5 – Dotnet

Odpowiedz

40

Framework .NET ma już klasy ses i metod dostępnych do konwersji DateTimes między różnymi strefami czasowymi. Spójrz na metody ConvertTime klasy TimeZoneInfo.

Edit: Kiedy masz czas, aby umieścić w bazie danych, zakładając, że został stworzony z właściwej strefy czasowej można łatwo przekonwertować do UTC:

DateTime utcTime = inputDateTime.ToUniversalTime(); 

Get timeInfo jak to zrobiono w edycji zapytania :

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

po wysłaniu czas bazy danych do użytkownika, przekonwertować go do właściwej strefy czasowej przy użyciu timeInfo.

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

Osobiście staram się zachować tę logikę oddzielnie od metod pobierania/ustawiania właściwości.

+18

ten [lista identyfikatorów stref czasowych] (http://stackoverflow.com/a/7908482/29) może być pomocna –

3
TimeZoneInfo infotime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time (Mexico)"); 
DateTime thisDate = TimeZoneInfo.ConvertTimeFromUtc(datetimeFromBD, infotime); 
Powiązane problemy