2012-10-17 13 views
11

Mam następujący sposób ASP.Net MVC Kontroler:Konwersja UTC DateTime do lokalnego DateTime

public ActionResult DoSomething(DateTime utcDate) 
{ 
    var localTime = utcDate.ToLocalTime(); 
} 

Problem polega na tym, że Localtime będzie miał dokładnie taką samą wartość jak utcDate. Zakładam, że to dlatego, że utcDate nie wie, że ma wartość UTC. Więc moje pytanie brzmi: w jaki sposób mogę przekonwertować utcDate (który WIEM jest UTC) na lokalny?

+0

wiesz co strefa czasu jesteś w – elyashiv

Odpowiedz

35

Jeśli wiesz się DateTime zawiera wartość UTC, można użyć the following:

DateTime iKnowThisIsUtc = whatever; 
DateTime runtimeKnowsThisIsUtc = DateTime.SpecifyKind(
    iKnowThisIsUtc, 
    DateTimeKind.Utc); 
DateTime localVersion = runtimeKnowsThisIsUtc.ToLocalTime(); 

Na przykład w mojej aktualnej aplikacji tworzę znaczniki czasu w mojej bazie danych za pomocą kodu SQL utcnow, ale po przeczytaniu ich w mojej aplikacji C#, Kind proeprty jest zawsze Unknown. Stworzyłem funkcję otoki, aby odczytać znacznik czasu, celowo ustawić jej Kind na Utc, a następnie przekonwertować ją na czas lokalny - zasadniczo jak wyżej.

Zauważ, że DateTime.ToLocalTime() tylko nie wpływa na wartości, jeśli jeden (lub oba) z następujących posiada:

  • DateTime „s Kind nieruchomość jest DateTimeKind.Local
  • Lokalna strefa czasowa jest taka, że„nie zmień "jest poprawna konwersja

Myślę, że możemy założyć, że drugi punkt nie jest prawdziwy. Tak więc wydaje się, że właściwość iKnowThisIsUtc 'Kind jest ustawiona na Local. Musisz dowiedzieć się, dlaczego to, co Ci dostarcza, uważa, że ​​są one lokalne.

+0

NB AFAIK jedynym sposobem 'ToLocalTime()' będzie _not change_ wartość jest czy środowisko wykonawcze myśli czas jest _already local _. * (tj. ma 'DateTimeKind.Local'.) Możesz chcieć sprawdzić, czy tak jest, a jeśli tak, dlaczego daty, które otrzymujesz, są oznaczone jako" Lokalne ", mimo że nie są. (* lub jeśli czas lokalny to oczywiście UTC) – Rawling

+0

+1 za pokonanie mnie do wyjaśnienia dodanego w komentarzu, chociaż naprawdę uważam, że należy on do odpowiedzi. –

+0

Kiedy zagłębiłem się w tę chwilę, okazało się, że jest to bardzo mylące. Twoja odpowiedź dobrze się sprawdza, ale niektóre przykłady prawdopodobnie pomogłyby. – TylerOhlsen

3

Spróbuj wykonać następujące czynności:

public static DateTime UtcToPacific(DateTime dateTime) 
     { 
      return TimeZoneInfo.ConvertTimeFromUtc(dateTime, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time")); 
     } 

Oczywiście zmienić Pacyfiku do lokalnej strefy czasowej.

Jeśli chcesz dowiedzieć się, jakie strefy czasowe są obecne na komputerze patrz poniższy link: http://msdn.microsoft.com/en-us/library/bb397781.aspx

1

lub to.

var localTime = new DateTimeOffset(utcDate,TimeSpan.FromHours(0)) 
        .ToLocalTime().DateTime;