2010-09-13 85 views
5

我在asp.net/c#上寫了一個相當大的webapp,MSSQL 2008 r2爲這個數據庫提供服務。該程序需要將date/time字符串(採用ISO日期格式)轉換爲DateTime,在此處使用它們並稍後存儲爲smalldatetime,sql轉換爲和從日期時間添加一小時?

當字符串轉換爲datetimes時,神祕地將hour添加到結果中。據我所知,在英國,我們受夏令時(目前活躍),但datetime .convert方法明白這一點?當轉換回字符串時,結果如預期。

我已經寫了一個小程序來說明這個問題(也包括我的理智非ISO日期):

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

下面是結果我得到當我運行該程序:

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 

這是正確的行爲嗎?我是個白癡嗎?我會期望將日期時間轉換爲字符串,然後確切的字符串回到日期時間將返回原始輸入。如果這是正確的行爲,關於如何獲得一致結果但仍使用Convert.ToDateTime()的任何想法?

很多謝謝。

回答

11

日期時間結束時的「Z」表示「祖魯語」(相當於UTC/GMT)。默認情況下,當你在一個字符串的末尾轉換字符串時,它會將其轉換爲本地時間(在你的情況下爲+ 1小時)。

如果沒有'Z'.NET將假定日期已經在正確的格式,而不是添加小時。

當您將日期時間格式化回字符串時,您使用的是格式字符串「U」。這告訴.NET,這是一個UTC時間,應該格式化爲這樣。因此它將'Z'添加到最後。當您將其轉換回日期時間時,會添加另一小時以使其成爲本地。

澄清:

D1:開始爲UTC串 - >的本地時間(+ 1小時) - > UTC串 - >的本地時間(1小時)

D2:開始作爲本地字符串 - >本地時間(無變化) - > UTC字符串 - >本地時間(+ 1小時)

+0

啊,所以放下「Z」將會解決問題。我不得不做一些字符串replcing,因爲這是我得到它的格式。(編輯 - 是的,似乎解決它。謝謝) – 2010-09-13 11:59:24