5

我正在编写一个相当大的 webapp 来为数据库asp.net/c#提供服务。MSSQL 2008 r2该程序需要将date/time字符串(以 ISO 日期格式)转换DateTime为使用它们的位置,然后smalldatetimesql.

当字符串转换为 时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()

非常感谢。

4

1 回答 1

11

日期时间末尾的“Z”表示“Zulu”(相当于 UTC/GMT)。默认情况下,当您将字符串转换为末尾的字符串时,它会将其转换为本地时间(在您的情况下为 + 1 小时)。

如果没有“Z”,.NET 将假定日期已经是正确的格式,而不是添加小时。

当您将日期时间格式化回字符串时,您使用的是“U”格式字符串。这告诉 .NET 它是 UTC 时间,应该这样格式化。因此,它将“Z”添加到末尾。当您将其转换回日期时间时,会添加另一个小时以使其成为本地时间。

澄清:

d1:以 UTC 字符串开头 -> 本地时间(+1 小时)-> UTC 字符串 -> 本地时间(+1 小时)

d2:以本地字符串开头 -> 本地时间(无变化)-> UTC 字符串 -> 本地时间(+ 1 小时)

于 2010-09-13T11:49:16.567 回答