【问题标题】:Deserialize ISO 8601 date time string to C# DateTime将 ISO 8601 日期时间字符串反序列化为 C# DateTime
【发布时间】:2013-06-25 15:20:35
【问题描述】:

我正在尝试使用:

JsonConvert.DeserializeObject<DateTime>( "2009-02-15T00:00:00Z", new IsoDateTimeConverter() )

但它给了我一个FormatException: Input string was not in a correct format.

我做错了什么?

【问题讨论】:

  • 需要用引号嵌入它。 "\"2009-02-15T00:00:00Z\""。谢谢,橡皮鸭!
  • 德克,你救了我的命!
  • 哈哈。对此表示怀疑,但很高兴我能提供帮助:)

标签: c# json.net


【解决方案1】:

如果您要解析单个值,最简单的方法可能就是使用DateTime.ParseExact:

DateTime value = DateTime.ParseExact(text, "o", null);

“o”模式是round-trip pattern,设计为符合 ISO-8601:

“O”或“o”标准格式说明符对应于“yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK”日期时间值的自定义格式字符串以及 DateTimeOffset 值的 "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz" 自定义格式字符串。

我没有指定格式提供者,因为没关系:

此说明符的模式反映了定义的标准 (ISO 8601)。因此,无论使用的文化或提供的格式提供程序如何,它总是相同的。

如果您需要 Json.NET 在反序列化其他值的同时透明地处理此问题,这可能是一个更棘手的提议 - 其他人可能知道更多。

此外,作为一个插件,您可能希望考虑使用我的Noda Time 项目,它支持 ISO-8601 并与 JSON.NET 集成 - 尽管目前还没有以预打包的方式。

【讨论】:

  • 如何使用 Noda Time 进行 ISO-8601 转换?
  • @DavidPfeffer:在 Noda Time 1.2 中,您将使用 OffsetDateTimePattern.GeneralIsoPattern 解析为 OffsetDateTime。或者如果它总是有一个Z而不是一个不同的偏移量,你可以使用InstantPattern.GeneralPattern。
猜你喜欢
  • 1970-01-01
  • 2019-02-27
  • 2017-07-25
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
相关资源
最近更新 更多