加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何让JSON.NET将日期/时间序列化为ISO 8601?

发布时间:2020-12-16 19:48:40 所属栏目:百科 来源:网络整理
导读:我有一个Web API应用程序,它将 JSON返回给可能没有使用Microsoft技术的消费者.当我的控制器返回一个DateTime属性为JSON的对象时,它以这种格式序列化日期: 2017-03-15T00:00:00-04:00 这让消费者有点头疼,因为他们期望它采用ISO 8601格式.一些研究告诉我,
我有一个Web API应用程序,它将 JSON返回给可能没有使用Microsoft技术的消费者.当我的控制器返回一个DateTime属性为JSON的对象时,它以这种格式序列化日期:

2017-03-15T00:00:00-04:00

这让消费者有点头疼,因为他们期望它采用ISO 8601格式.一些研究告诉我,JSON.NET现在默认使用ISO 8601(我使用的是9.0.1).当我运行此代码时……

Clipboard.Copy(JsonConvert.SerializeObject(DateTime.Now));

……我明白了:

2017-03-15T09:10:13.8105498-04:00

维基百科在表达完整日期和时间时将这些显示为有效的ISO 8601格式:

2017-03-15T11:45:42+00:00
2017-03-15T11:45:42Z
20170315T114542Z

但是,我上面得到的输出并不完全匹配.我希望格式化程序使用2017-03-15T11:45:42Z.

并且可能完全值得另外一个问题,在我的Web API配置中添加以下行似乎被忽略,因为它继续在上面最初显示的日期返回JSON:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new IsoDateTimeConverter());

我假设一旦找出核心问题,Web API问题也可能得到解决.

你得到的格式是ISO 8601格式(阅读维基百科上的时间和时区指示符部分),只是你的日期显然没有调整到UTC时间,所以你得到一个时区偏移附加到日期而不是Z祖鲁时区指标.

IsoDateTimeConverter具有可用于自定义其输出的设置.您可以通过将DateTimeStyles设置为AdjustToUniversal使其自动将日期调整为UTC.如果不需要,您还可以自定义输出格式以省略小数秒.默认情况下,转换器不会调整为UTC时间,并且包含与秒可用的精度小数一样多的小数.

试试这个:

IsoDateTimeConverter converter = new IsoDateTimeConverter
{
    DateTimeStyles = DateTimeStyles.AdjustToUniversal,DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssK"
};

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(converter);

如果您的日期已经是UTC,但它们上的DateTimeKind未设置为Utc(例如它是未指定的),那么理想情况下您应该修复代码,以便在序列化之前正确设置此指标.但是,如果您不能(或不想)这样做,您可以通过更改转换器设置来处理它,以便始终以日期格式包含Z指示符(而不是使用查看DateTimeKind的K说明符)在日期)并删除AdjustToUniversal指令.

IsoDateTimeConverter converter = new IsoDateTimeConverter
{
    DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读