试试这个:
string ReceivedDateTimeString = "2012-10-09T07:42:13.409191Z";
DateTime TransformedReceivedDateTimeString =
DateTime.ParseExact(ReceivedDateTimeString,
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFFK",
CultureInfo.InvariantCulture,
DateTimeStyles.RoundTripKind);
“o”格式说明符的文档指出:
"O" 或 "o" 标准格式说明符对应于 DateTime 值的 "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK" 自定义格式字符串和"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz" DateTimeOffset 值的自定义格式字符串。
即 7 位小数,而不是字符串中的 6 位。
如果样式参数设置为 DateTimeStyles.RoundtripKind,则可以使用 DateTimeParse(String, IFormatProvider, DateTimeStyles) 或 DateTimeParseExact 方法解析格式化的字符串。
即您需要指定DateTimeStyles.RoundtripKind。
在上面,我使用了“FFF...”而不是“fff...”,因为这将接受可变数量的小数(缺少的尾随小数被视为零)。这是为了符合“容进严出”的原则。
我还指定 DateTimeStyles.RoundtripKind 在解析时保留 Kind 属性(在这种情况下为 Utc)。如果不这样做,结果将转换为本地时间。