关于.net:C#datetime解析问题

C# datetime parse issue

当尝试将日期/时间从字符串转换为DateTime时,我没有得到正确的值。

1
DateTime testDate = DateTime.ParseExact("2012-08-10T00:51:14.146Z","yyyy-MM-ddTHH:mm:ss.fffZ",    CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);

我的结果是2012-08-09 8:51:14 PM。 为什么会被抵消? 我只是想让它成为同样的价值。


您正在解析UTC日期,但DateTime.Kind是本地的。
您应该使用DateTimeStyles.AdjustToUniversal进行解析,以将Kind标记为Utc。

1
2
3
4
5
6
7
8
9
10
11
12
13
        DateTime testDate = DateTime.ParseExact("2012-08-10T00:51:14.146Z","yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);

        Trace.WriteLine(testDate);  //  8/9/2012 8:51:14 PM
        Trace.WriteLine(testDate.ToString()); //  8/9/2012 8:51:14 PM
        Trace.WriteLine(testDate.ToUniversalTime()); //  8/10/2012 12:51:14 AM
        Trace.WriteLine(testDate.Kind); // Local

       testDate = DateTime.ParseExact("2012-08-10T00:51:14.146Z","yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

        Trace.WriteLine(testDate);//  8/10/2012 12:51:14 AM
        Trace.WriteLine(testDate.ToString());//  8/10/2012 12:51:14 AM
        Trace.WriteLine(testDate.ToUniversalTime());//  8/10/2012 12:51:14 AM
        Trace.WriteLine(testDate.Kind); // Utc


您应该使用DateTimeStyles.AdjustToUniversal。输入DateTime已经是通用的,而AdjustToUniversal枚举选项会将输入转换为本地时间,但您将得到一个DateTimeKind.Unspecified的结果。


什么是服务器时区,如果使用AssumeUniversal,它会将您的输入时间转换为UTC时间。

你可能在美国东部时间。


我建议您只想使用.AssumeLocal而不是.AssumeUniversal

你有一个带有未知时区的时间戳,如果你知道时间戳是指你当地时区发生的事件,那么你应该告诉解析假设时间戳是你本地的(即在你的时区)。

通过使用.AssumeUniversal,您指示解析器将时间戳视为UTC时间戳,当您使用本地时区显示时,它会自动偏移该量。

编辑:

一件重要的事情:时间戳中的大写字母"Z"表示它是UTC时间戳,这意味着您确实希望将其视为通用。如果要将其视为本地时间戳,则应从时间戳和相应的解析字符串中删除Z.

参考:http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx#KSpecifier