C#日期时间解析问题

C#日期时间解析问题,c#,.net,datetime,C#,.net,Datetime,当尝试将日期/时间从字符串转换为日期时间时,我没有得到正确的值 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。为什么会被抵消?我只想输入相同的值。您的服务器时区是什么,如

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

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。为什么会被抵消?我只想输入相同的值。

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


您可能在EST中。您应该使用。输入的
DateTime
已经是通用的,AdjustToUniversal enum选项将把输入转换为本地时间,尽管您将得到一种结果类型的
DateTimeKind.Unspecified
您正在解析UTC日期,但DateTime.Kind是本地的。 您应该使用DateTimeStyles.AdjustToUniversal进行分析,以将种类标记为Utc

        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

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

您有一个时区未知的时间戳,如果您知道该时间戳指的是在本地时区发生的事件,那么您应该告诉解析程序假定该时间戳是您本地的(即在您的时区)

通过使用
.AssumeUniversal
,您指示解析器将时间戳视为UTC时间戳,当您使用本地时区显示时,它会自动被该值抵消

编辑:

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


参考资料:

意识到这是一个多年后的答案,但今天我遇到了这个问题,一旦我解决了我的问题,我想添加一些我在其他答案中没有看到的上下文

回到OPs代码片段,它没有按照OP的要求获取UTC时间字符串并将其存储为UTC
DateTime
是因为
datetimestyle。AssumeUniversal
仅指定输入字符串为UTC字符串。默认情况下,C#将创建
DateTime
,作为
DateTimeKind.Local
。另一份答复指出了这一点。这意味着时间将从UTC转换为本地时间

要确保最终结果为UTC
DateTime
,您需要使用
datetimestyle.AdjustToUniversal
datetimestyle
。其他答复也提到了这一点。但是,如果您的输入字符串没有明显的时区,则可以假定它是本地的,然后从本地转换为UTC

幸运的是DateTimeStyles实际上是一个标志枚举,这意味着我们可以同时使用上述两个选项。例如:

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

嗯,让我试一下,不带款式。那没用。日期和时间仍然是相互抵消的。注:史蒂夫一针见血。请注意,在更改为“AdjustToUniversal”后,默认情况下它是如何打印为UTC的。。。当被问及“ToUniversal”时。基本上,您所做的是获取数据,并将UTC时间解析为本地时间(将其标记为本地时间)。。。通过切换您所说的样式,解析并将其标记为UTC。好的,调试器将基于我的服务器对其进行翻译。嗯,所以你使用跟踪进行调试是因为这个?所以即使它是通用的,如果我想显示它,我也必须将它转换为通用的?奇怪的实现,但我想我可以处理它。调试器可能会将您看到的内容转换为字符串,这比它内部存储的表示时间/种类的数字有用得多。。。等等…这类东西实际上是本地的,不是未指定的。有趣的是…文档中另有说明。但是有些事情要考虑。DateTime问题可能会导致数小时的痛苦。是的,我几乎认为你应该始终使用DateTime Offset来明确“本地”的真正含义。见: