将UTC字符串转换为DateTime时出现异常

时间:2012-10-09 08:15:36

标签: c# .net

我从Web服务接收下面的日期时间字符串,并尝试将其转换为UTC日期时间对象但抛出异常。

try
{
    string ReceivedDateTimeString = "2012-10-09T07:42:13.409191Z";
    DateTime TransformedReceivedDateTimeString = DateTime.ParseExact(ReceivedDateTimeString, "o", CultureInfo.InvariantCulture, DateTimeStyles.None);
}
catch (Exception e)
}

为什么会抛出异常?字符串的格式或我的转换是否有问题?

3 个答案:

答案 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个小数位。

现在是同样的错误。你有三种可能的解决方案:

  1. 正如您在上一个问题(comment)中所述,您可以拥有自己的数据 提供商向您发送标准格式的数据。
  2. 如果您无权访问数据,可以将样式参数更改为自定义格式: "yyyy-MM-ddTHH:mm:ss.ffffffK"
  3. 或者,您可以在结尾添加另一个小数,以遵循标准格式: "2012-10-09T07:42:13.4091910Z";
  4. 更改标准格式