我从Web服务接收下面的日期时间字符串,并尝试将其转换为UTC日期时间对象但抛出异常。
try
{
string ReceivedDateTimeString = "2012-10-09T07:42:13.409191Z";
DateTime TransformedReceivedDateTimeString = DateTime.ParseExact(ReceivedDateTimeString, "o", CultureInfo.InvariantCulture, DateTimeStyles.None);
}
catch (Exception e)
}
为什么会抛出异常?字符串的格式或我的转换是否有问题?
答案 0 :(得分:2)
试试这个:
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);
documentation for the "o" format specifier表示:
“O”或“o”标准格式说明符对应于“yyyy” - “MM” - “dd'T'HH”:“mm”:“ss”。“fffffffK”日期时间值的自定义格式字符串和'yyyy' - 'MM' - 'dd'T'HH':'mm':'ss'。'fffffffzzz'是DateTimeOffset值的自定义格式字符串。
即。 7位小数,而不是字符串中的6位。
如果styles参数设置为DateTimeStyles.RoundtripKind,则可以使用DateTimeParse(String,IFormatProvider,DateTimeStyles)或DateTimeParseExact方法解析格式化的字符串。
即。你需要指定DateTimeStyles.RoundtripKind。
在上面,我使用了“FFF ...”而不是“fff ...”,因为这将接受可变数量的小数(缺少尾随小数被视为零)。这符合“输入容忍,输出严格”的原则。
此外,我还指定了DateTimeStyles.RoundtripKind以在解析时保留Kind属性(在本例中为Utc)。如果不这样做,结果将转换为当地时间。
答案 1 :(得分:1)
这个怎么样:
DateTime TransformedReceivedDateTimeString = DateTime.Parse(ReceivedDateTimeString).ToUniversalTime();
答案 2 :(得分:1)
嗯,Jon Skeet最后一次给出了正确答案:UTC string to DateTime exception
请注意,那里有7个fs,但你只有6个小数位。
现在是同样的错误。你有三种可能的解决方案:
"yyyy-MM-ddTHH:mm:ss.ffffffK"
"2012-10-09T07:42:13.4091910Z";
更改标准格式