我有以下日期字符串: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
无法弄清楚我在这里缺少什么。
答案 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
告诉它将任何带有偏移量的值视为本地时间(如前所述),但任何值都包含Z
,UTC
,GMT
等。拥有DateTimeKind.Utc
。
传递DateTimeStyles.AdjustToUniversal
告诉它总是的输出有DateTimeKind.Utc
,并且必要时应调整该值。
使用DateTimeOffset.Parse
进行解析会绕过所有这些错综复杂的行为,只返回一个偏移量与提供的值匹配的值。当输入字符串中存在偏移量(或Z
)时,这是最佳方法。如果您需要DateTime
,则可以使用生成的UtcDateTime
中的LocalDateTime
,DateTime
或DateTimeOffset
属性。
只要Kind
为UTC,您提供的时区转换代码就是正确的。使用ConvertTimeFromUtc
会更明确,但在这种情况下,这并不重要。最好的方法是使用符合ConvertTime
值的DateTimeOffset
重载。结果值为DateTimeOffset
,其DateTime
属性与该时区中的时间匹配,其Offset
属性是该时区内该时间的正确偏移量。