2013-07-31 19 views
6

ho una soluzione di tre progetti:Conversione UTC in ora locale restituisce strano risultato

  1. Nucleo
  2. Outlook Add-In
  3. ASP.NET Sito

Entrambi, l'Outlook Il componente aggiuntivo e il sito Web utilizzano gli stessi metodi del progetto principale per ottenere dati da SQL Server. Quando scrivo i miei dati nel database, posso convertire tutti i DateTime valori di due tabelle in tempo UTC:

POLL_START    POLL_END 
2013-07-31 12:00:00.000 2013-08-01 12:00:00.000 

e

PICK_DATE 
2013-07-31 12:00:48.000 
2013-07-31 13:00:12.000 

Quando ottengo i dati nel mio Outlook Add-In, questo è il risultato corretto:

enter image description here enter image description here

Quando si apre lo stesso nel mio sito, le scelte vanno bene:

enter image description here

Ma il mio inizio e di fine sono "spezzato" - l'offset viene aggiunto, Bute le ore sbagliate vengono utilizzati:

enter image description here

Ecco il codice per la mia conversione, che entrambi, Outlook e il sito web, l'uso:

private static void ConvertToLocalTime(POLL item) 
{ 
    item.POLL_START = item.POLL_START.FromUTC(); 
    item.POLL_END = item.POLL_END.FromUTC(); 
} 

private static void ConvertToLocalTime(PICK pick) 
{ 
    if (pick.PICK_DATE != null) pick.PICK_DATE = ((DateTime)pick.PICK_DATE).FromUTC(); 
} 

E l'attuazione di DateTime.FromUtc():

public static DateTime FromUTC(this DateTime value) 
{ 
    var local = TimeZoneInfo.Local; 
    return TimeZoneInfo.ConvertTime(value, TimeZoneInfo.Utc, local); 
} 

Ho avuto lo stesso risultato con DateTime.ToLocalTime(). Qualcuno un'idea?

EDIT 1:

Questo è come l'inizio e la fine ottiene visualizzati sul sito web (end con End invece di Start):

var startCell = new TableCell 
     { 
      Text = String.Format(
       @"<a href='{0}' title='{2}' target='_blank'>{1:dd.MM.yyyy HH:mm \U\T\Czzz}</a>", 
        Common.GetTimeAndDateHyperlink(_poll.Start, "Vote Start"), 
        _poll.Start, 
        ConvertToLocalTimeZone), 
      CssClass = "InfoContent" 
     }; 

E i picconi:

answerCell = new TableCell 
      { 
       Text = String.Format(
        @"<a href='{0}' title='{2}' target='_blank'>{1}</a>", 
         Common.GetTimeAndDateHyperlink(ao.Time, ao.RealAnswer), 
         ao.RealAnswer, 
         ConvertToLocalTimeZone) 
      }; 

ao.RealAnswer restituisce la stringa DateTime formata:

return String.Format(WholeTime == true ? "{0:d}" : @"{0:dd.MM.yyyy HH:mm \U\T\Czzz}", Time); 
+0

Qual è il codice che stai utilizzando per visualizzare l'ora sulla tua pagina web? – Romoku

+0

@Romoku ha aggiunto il codice – Herdo

+0

Ho intenzione di indovinare che la proprietà [Tipo] (http://msdn.microsoft.com/en-us/library/system.datetime.kind.aspx) è diversa tra i due. – Greg

risposta

1

Ho risolto il problema ora. I valori DateTime per inizio e fine non sono stati convertiti correttamente: i valori non sono stati convertiti in ora locale.

La ragione, per cui il sito visualizzato il tempo come ora locale è, che i negozi del server SQL ogni valore come DateTimeKind.Unspecified invece di mantenere il DateTime specificato dati (ad esempio DateTimeKind.Utc) durante l'inserto. Durante la lettura dei dati dal server, tutti i tipi sono DateTimeKind.Unspecified, pertanto lo .ToString() di DateTime utilizza il tipo locale. Questo risulta nell'ora UTC + offset UTC locale.