2013-07-31 17 views
6

Mam roztwór trzech projektów:Konwersja UTC na czas lokalny zwraca dziwny wynik

  1. rdzenia
  2. Outlook Add-In
  3. ASP.NET Witryna

Zarówno Outlook Dodatek i strona internetowa używają tych samych metod z projektu Core, aby pobrać dane z SQL Server. Kiedy piszę moich danych w bazie danych, przekonwertować wszystkie DateTime wartości dwóch stołów do czasu UTC:

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

i

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

Kiedy uzyskać dane w moim Outlook Add-in, to jest poprawny wynik:

enter image description here enter image description here

Otwierając to samo w mojej stronie, że rozgrywki są w porządku:

enter image description here

Ale mój czas rozpoczęcia i zakończenia są „złamane” - offset dodaje Bute stosowane są niewłaściwe godziny:

enter image description here

Oto kod dla mojego konwersji, że zarówno program Outlook i na stronie internetowej, zastosowanie:

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

I realizacja DateTime.FromUtc():

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

miałem ten sam wynik z DateTime.ToLocalTime(). Masz pomysł?

EDIT 1:

ten sposób początek i koniec zostanie wyświetlony na stronie internetowej (koniec z End zamiast 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" 
     }; 

A rozgrywki:

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 zwraca sformatowany łańcuch DateTime:

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

Jaki jest kod używany do wyświetlania czasu na swojej stronie internetowej? – Romoku

+0

@Romoku dodaje kod – Herdo

+0

Zgaduję, że właściwość [Kind] (http://msdn.microsoft.com/en-us/library/system.datetime.kind.aspx) różni się między tymi dwoma. – Greg

Odpowiedz

1

Rozwiązałem już problem. Wartości DateTime dla początku i końca nie zostały poprawnie przekonwertowane: wartości nie zostały przeniesione do czasu lokalnego.

Powodem, dlaczego strona wyświetlana czas jako czas lokalny jest, że w sklepach serwera SQL każdy DateTime wartość jako DateTimeKind.Unspecified zamiast utrzymywania określony danych (np DateTimeKind.Utc) podczas wkładki. Podczas odczytu danych z serwera wszystkie rodzaje są DateTimeKind.Unspecified, więc .ToString() z DateTime używa lokalnego rodzaju. To powoduje, że czas UTC + lokalne przesunięcie UTC.

Powiązane problemy