TimeZoneInfo.ConvertTime方法未正确转换DateTime

时间:2015-11-21 23:36:18

标签: c# .net datetime timezone

我有以下日期字符串:2015-11-10T23:52:18.5245011Z
当我使用DateTime.Parse方法解析它时,它返回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

无法弄清楚我在这里缺少什么。

1 个答案:

答案 0 :(得分:1)

使用:

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调整为本地时区。

如果没有偏移信息,则会返回DateTime种类Unspecified

传递DateTimeStyles.RoundtripKind告诉它将任何带有偏移量的值视为本地时间(如前所述),但任何值都包含ZUTCGMT等。拥有DateTimeKind.Utc

传递DateTimeStyles.AdjustToUniversal告诉它总是的输出有DateTimeKind.Utc,并且必要时应调整该值。

使用DateTimeOffset.Parse进行解析会绕过所有这些错综复杂的行为,只返回一个偏移量与提供的值匹配的值。当输入字符串中存在偏移量(或Z)时,这是最佳方法。如果您需要DateTime,则可以使用生成的UtcDateTime中的LocalDateTimeDateTimeDateTimeOffset属性。

只要Kind为UTC,您提供的时区转换代码就是正确的。使用ConvertTimeFromUtc会更明确,但在这种情况下,这并不重要。最好的方法是使用符合ConvertTime值的DateTimeOffset重载。结果值为DateTimeOffset,其DateTime属性与该时区中的时间匹配,其Offset属性是该时区内该时间的正确偏移量。