TimeZoneInfo.ConvertTime方法未正确转换DateTime



我有以下日期字符串: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

我想不出我在这里缺了什么。

使用:

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

或者:

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

或者(最佳选项):

DateTimeOffset.Parse(s)

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

如果不存在偏移信息,则返回具有Unspecified类型的DateTime

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新