TimeZoneInfo.ConvertTime 方法未正确转换 DateTime

TimeZoneInfo.ConvertTime method not converting the DateTime correctly

我有以下日期字符串:2015-11-10T23:52:18.5245011Z
当我使用 DateTime.Parse 方法解析它时 returns 11/11/2015 10:52:18 AM 这是不正确的。

我也尝试了以下转换:

TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
DateTime targetTimeUtcconverted = TimeZoneInfo.ConvertTime(UtcDate, est);

它仍然给出:11/11/2015 10:52:18 AM

无法弄清楚我在这里遗漏了什么。

使用:

DateTime.Parse(s, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind)

或:

DateTime.Parse(s, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal)

或(最佳选择):

DateTimeOffset.Parse(s)

默认情况下,如果字符串中存在任何偏移信息,DateTime.Parse 将调整为本地时间。由于 Z+00:00 相同,它假定输入为 +00:00,然后从 UTC 调整为本地时区。

如果不存在偏移量信息,则 returns DateTimeUnspecified 种类。

传递 DateTimeStyles.RoundtripKind 告诉它将任何具有偏移量的值视为本地时间(和以前一样),但任何包含 ZUTCGMT 的值,等等 DateTimeKind.Utc.

传递 DateTimeStyles.AdjustToUniversal 告诉它输出应该 总是 DateTimeKind.Utc,如果需要应该调整值。

使用 DateTimeOffset.Parse 进行解析会绕过所有这些复杂的行为,而只是 returns 一个具有与所提供内容相匹配的偏移量的值。当输入字符串中存在偏移量(或 Z)时,这是最佳方法。如果您需要 DateTime,您可以使用结果 DateTimeOffset.

中的 UtcDateTimeLocalDateTimeDateTime 属性

只要Kind是UTC,你给的时区转换码就是正确的。使用 ConvertTimeFromUtc 会更明确,但在这种情况下这并不重要。最好的方法是使用与 DateTimeOffset 值一起使用的 ConvertTime 的重载。结果值将是一个 DateTimeOffset,其 DateTime 属性 与该时区的时间匹配,其 Offset 属性 是该时间的正确偏移量那个时区。