当尝试将日期/时间从字符串转换为DateTime时,我没有得到正确的值.
DateTime testDate = DateTime.ParseExact("2012-08-10T00:51:14.146Z", "yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
Run Code Online (Sandbox Code Playgroud)
我的结果是2012-08-09 8:51:14 PM.为什么会被抵消?我只是想让它成为同样的价值.
Joh*_*ski 21
您正在解析UTC日期,但DateTime.Kind是本地的.您应该使用DateTimeStyles.AdjustToUniversal进行解析,以将Kind标记为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
Run Code Online (Sandbox Code Playgroud)
小智 14
意识到这是多年后的答案,但今天遇到了这个问题,一旦我解决了我的问题,就想添加一些我在其他答案中没有看到的上下文。
回到 OP 代码片段,它没有按照 OP 的预期获取 UTC 时间字符串并将其存储为 UTC 的原因DateTime
是因为DateTimeStyles.AssumeUniversal
唯一指定输入字符串是 UTC 字符串。默认情况下,C# 会将DateTime
's 创建为DateTimeKind.Local
. 这一点在另一个答案中已经指出了。这意味着时间从 UTC 转换为本地时间。
为了确保您的最终结果是 UTC,DateTime
您需要使用DateTimeStyles
of DateTimeStyles.AdjustToUniversal
。这一点在其他答案中也提到过。但是,如果您的输入字符串没有明显的时区,则可能会假定它是本地时区,然后从本地转换为 UTC。
幸运的是,DateTimeStyles 实际上是一个标志枚举,这意味着我们可以同时使用上述两个选项。例如:
DateTime testDate = DateTime.ParseExact("2012-08-10T00:51:14.146Z", "yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);
Run Code Online (Sandbox Code Playgroud)
您应该使用DateTimeStyles.AdjustToUniversal。输入DateTime
已经是通用的,AdjustToUniversal 枚举选项会将输入转换为本地时间,尽管您将得到结果 Kind of DateTimeKind.Unspecified
.