2010-09-13 3 views
5

Piszę dość duży webapp w asp.net/c# z MSSQL 2008 r2 obsługujących bazę danych. Program musi konwertować ciągi znaków date/time (w formacie daty ISO) na DateTime, gdzie są używane, a następnie przechowywane jako smalldatetime w sql.Konwersja do iz datetime dodaje godzinę?

Po zamianie ciągów znaków na datetimes, tajemniczo dodano do wyniku znak hour. Rozumiem, że będąc w Wielkiej Brytanii, jesteśmy poddawani czasom letnim (obecnie aktywne), ale z pewnością rozumie to metoda datetime .convert? Podczas konwersji z powrotem na ciąg, wynik jest zgodny z oczekiwaniami.

Napisałem mały program do zilustrowania problemu (w tym także spoza terminach ISO dla mojego zdrowia psychicznego):

class Program 
{ 


    static void Main(string[] args) 
    { 
     //BB(); 
     //Dist(); 
     DateTime d1 = new DateTime(); 
     DateTime d2 = new DateTime(); 
     string d1s = "2010-09-13T09:30:01Z"; 
     string d2s = "2010-09-13 09:30:01"; 

     d1 = Convert.ToDateTime(d1s); 
     d2 = Convert.ToDateTime(d2s); 

     Console.WriteLine("d1s:{0} d1:{1} ", d1s, d1); 
     Console.WriteLine("d2s:{0} d2:{1} ", d2s, d2); 

     d1s = d1.ToString("u"); d2s = d2.ToString("u"); 

     Console.WriteLine("\nd1: {0}", d1s); 
     Console.WriteLine("d2: {0}", d2s); 

     d1 = Convert.ToDateTime(d1s); 
     d2 = Convert.ToDateTime(d2s); 

     Console.WriteLine("\nd1s:{0} d1:{1} ", d1s, d1); 
     Console.WriteLine("d2s:{0} d2:{1} ", d2s, d2); 

     Console.Read(); 
    } 
} 

Oto wyniki dostaję gdy uruchamiam program:

d1s:2010-09-13T09:30:01Z d1:13/09/2010 10:30:01 
d2s:2010-09-13 09:30:01 d2:13/09/2010 09:30:01 

d1: 2010-09-13 10:30:01Z 
d2: 2010-09-13 09:30:01Z 

d1s:2010-09-13 10:30:01Z d1:13/09/2010 11:30:01 
d2s:2010-09-13 09:30:01Z d2:13/09/2010 10:30:01 
Done 

Czy to jest prawidłowe zachowanie? Czy jestem idiotą? Oczekiwałabym konwersji datetime na string, a następnie dokładny łańcuch z powrotem do datetime zwróciłby oryginalne dane wejściowe. Jeśli to jest prawidłowe zachowanie, wszelkie pomysły, jak uzyskać spójny wynik, ale nadal przy użyciu Convert.ToDateTime()?

Wielkie dzięki.

Odpowiedz

11

"Z" na końcu datetime oznacza "Zulu" (odpowiednik UTC/GMT). Domyślnie, gdy konwertujesz ciąg znaków na końcu, przekształci go w czas lokalny (+ 1 godzina w twoim przypadku).

Bez "Z" .NET zakłada się, że data jest już w odpowiednim formacie i nie dodaje godziny.

Po ponownym sformatowaniu datetime na ciąg używasz ciągu formatującego "U". Mówi to .NET, że jest to czas UTC i powinien być sformatowany na takich. Dlatego dodaje "Z" do końca. Po przekonwertowaniu go na datę, dodana zostanie kolejna godzina, aby zmienić ją na lokalną.

Dla wyjaśnienia:

d1: Rozpoczyna jako ciąg UTC -> czasu lokalnego (+ 1 godzina) -> UTC String -> czas lokalny (1 godzina)

d2: rozpoczyna się lokalny ciąg -> czas lokalny (bez zmian) -> łańcuch UTC -> czas lokalny (+ 1 godzina)

+0

Ahh, więc zrzucenie "Z" naprawi wszystko. Będę musiał wprowadzić kilka ciągów znaków, ponieważ jest to format, w który go wprowadzam. (Edycja - tak, to chyba naprawiło.) –