2010-09-13 40 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