2012-10-17 4 views
11

ich folgende ASP.Net MVC-Controller-Methode habe:Konvertieren von UTC Datetime zu lokalem Datetime

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

Das Problem ist, dass localtime mit dem exakt gleichen Wert wie utcDate hat. Ich nehme an, dies ist, weil UtcDate nicht weiß, dass es einen UTC-Wert hat. Also meine Frage ist, wie kann ich UtcDate (was ich weiß, ist UTC) in lokale konvertieren?

+0

wissen Sie, in welcher Zeitzone Sie sind in – elyashiv

Antwort

35

Wenn Sie die DateTime enthält einen UTC-Wert kennen , können Sie the following verwenden:

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

Zum Beispiel, in meiner aktuellen Anwendung, erstellen ich Zeitstempel in meiner Datenbank mit SQL utcnow, aber wenn ich sie in meine C# -Anwendung lesen, ist die Kind proeprty immer Unknown. Ich habe eine Wrapper-Funktion erstellt, um den Zeitstempel zu lesen, setze ihn bewusst auf Kind auf Utc und wandle ihn dann in die lokale Zeit um - im Wesentlichen wie oben.

Beachten Sie, dass DateTime.ToLocalTime() nur den Wert nicht beeinflussen, wenn eine (oder beide) der gilt:

  • Die DateTime ‚s Kind Eigenschaft DateTimeKind.Local
  • Ihre lokale Zeitzone so ist, ist, dass„kein change "ist die korrekte Konvertierung

Ich denke, wir können davon ausgehen, der zweite Punkt ist nicht wahr. Daher scheint die iKnowThisIsUtcKind Eigenschaft bereits auf Local eingestellt zu sein. Sie müssen herausfinden, warum, was auch immer Sie mit diesen DateTime s liefert sie denkt, dass sie lokal sind.

+0

NB AFAIK der einzige Weg, 'ToLocalTime()' wird der Wert _not change_ ist, wenn die Laufzeit die Zeit denkt ist _bereits lokal _. * (I.e. Es hat "DateTimeKind.Local".) Sie sollten überprüfen, ob dies der Fall ist, und wenn ja, warum die Daten, die Sie erhalten, als "Local" markiert sind, obwohl sie nicht sind. (* oder wenn die Ortszeit ist natürlich UTC) – Rawling

+0

+1 für mich zu der Erklärung zu schlagen, die Sie in den Kommentar hinzugefügt haben, obwohl ich wirklich denke, dass es als Teil der Antwort gehört. –

+0

Als ich vor einer Weile in dieses Thema geschaut habe, fand ich es sehr verwirrend. Ihre Antwort macht einen guten Job als Erklärung, aber einige Beispiele würden wahrscheinlich helfen. – TylerOhlsen

3

Versuchen Sie Folgendes:

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

Offensichtlich Pazifik auf Ihre lokale Zeitzone ändern.

Wenn Sie herausfinden möchten, welche Zeitzonen vorhanden sind, auf Ihrem Computer den folgenden Link sehen: http://msdn.microsoft.com/en-us/library/bb397781.aspx

1

oder dies:.

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