-2

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

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

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

4

3 回答 3

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);

“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)。如果不这样做,结果将转换为本地时间。

于 2012-10-09T08:27:06.713 回答
1

那这个呢:

DateTime TransformedReceivedDateTimeString = DateTime.Parse(ReceivedDateTimeString).ToUniversalTime();
于 2012-10-09T08:18:12.010 回答
1

好吧,Jon Skeet 最后一次给了你正确的答案:UTC string to DateTime exception

请注意,那里有 7 个 fs,但您只有 6 个小数位。

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

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

更改标准格式

于 2012-10-09T08:24:12.733 回答