我正在asp.net/c#
编写一个相当大的网络应用程序,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
这是正确的行为吗?我是个白痴吗?我原本期望将datetime转换为字符串,然后返回到datetime的确切字符串将返回原始输入。如果这是正确的行为,有关如何获得一致结果但仍然使用Convert.ToDateTime()
的任何想法?
非常感谢。
答案 0 :(得分:11)
日期时间结束时的“Z”表示“Zulu”(相当于UTC / GMT)。默认情况下,当您将字符串转换为结尾处的字符串时,它会将其转换为本地时间(在您的情况下为+ 1小时)。
如果没有'Z',.NET将假设日期格式正确,而不是添加小时。
当您将日期时间格式化为字符串时,您使用的格式字符串为“U”。这告诉.NET它是UTC时间,应该格式化。因此它将'Z'添加到最后。当您将其转换回日期时,会添加另一个小时以使其成为本地。
澄清:
d1:以UTC字符串开头 - >当地时间(+ 1小时) - > UTC字符串 - >当地时间(+1小时)
d2:作为本地字符串开始 - >当地时间(无变化) - > UTC字符串 - >当地时间(+ 1小时)