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