2012-10-17 5 views
11

Ho il seguente metodo di ASP.Net MVC Controller:Conversione UTC DateTime DateTime locale

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

Il problema è che localTime avrà lo stesso valore esatto come UTCDate. Presumo questo perché utcDate non sa che ha un valore UTC. Quindi la mia domanda è: come posso convertire utcDate (che conosco UTC) in locale?

+0

sai cosa fuso orario ci si trova – elyashiv

risposta

35

Se conosce il DateTime contiene un valore UTC, è possibile utilizzare the following:

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

Ad esempio, nella mia attuale applicazione, creo timestamp nel mio database con SQL utcnow, ma quando li ho letti nella mia applicazione C# la proprietà Kind è sempre Unknown. Ho creato una funzione wrapper per leggere il timestamp, impostare volutamente il suo Kind su Utc e quindi convertirlo in ora locale, essenzialmente come sopra.

Nota che DateTime.ToLocalTime() solo non influisce sul valore se uno (o entrambi) dei seguenti stive:

  • Kind proprietà s' Il DateTime è DateTimeKind.Local
  • tuo fuso orario locale è tale che "non modifica "è la conversione corretta

Penso che possiamo supporre che il secondo punto non sia vero. Pertanto, sembra che la proprietà sia impostata su Local. Hai bisogno di capire perché qualunque cosa ti fornisca questi DateTime s pensa che siano locali.

+0

NB AFAIK l'unico modo 'ToLocalTime()' sarà _non change_ il valore è se il runtime pensa che il tempo è _already local _. * (I.e. ha 'DateTimeKind.Local'.) Potresti voler controllare se questo è il caso e, in tal caso, perché le date che stai ricevendo sono contrassegnate come' Local' anche se non lo sono. (* o se l'ora locale è UTC ovviamente) – Rawling

+0

+1 per avermi battuto alla spiegazione che hai aggiunto nel commento, anche se penso davvero che appartenga come parte della risposta. –

+0

Quando l'ho guardato un po 'indietro ho trovato molto confusionario. La tua risposta fa un buon lavoro come spiegarlo, ma alcuni esempi potrebbero aiutare. – TylerOhlsen

3

provare quanto segue:

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

Ovviamente cambia Pacifico per il fuso orario locale.

Se volete scoprire quali zone di tempo sono presenti sulla vostra macchina consultare il seguente link: http://msdn.microsoft.com/en-us/library/bb397781.aspx

1

o questo:.

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