使用几分之一秒不一致序列化DateTime(.NET)

时间:2017-04-03 17:37:08

标签: c# json json.net

在序列化DateTimeDateTimeOffset时,我会根据第二部分获得不一致的结果。如果fraction == 0,则第二部分为00,如果fraction > 0,则第二部分为00.999

class MyDateHoldingThingy
{
    public DateTime DateTime { get; set; }
    public DateTimeOffset DateTimeWithTz { get; set; }
    public string GimmeJson()
    {
        return JsonConvert.SerializeObject(this);
    }
}

public void SerializeDateThingy(int fraction)
{
    var d = new MyDateHoldingThingy
    {
        DateTime = new DateTime(2017, 4, 3, 19, 21, 0, fraction),
        DateTimeWithTz = new DateTimeOffset(2017, 4, 3, 19, 21, 0, fraction, TimeSpan.FromHours(2))
    };

    Console.WriteLine(d.GimmeJson());
}

使用

进行通话
SerializeDateThingy(0);
SerializeDateThingy(999);

结果

{"DateTime":"2017-04-03T19:21:00","DateTimeWithTz":"2017-04-03T19:21:00+02:00"}
{"DateTime":"2017-04-03T19:21:00.999","DateTimeWithTz":"2017-04-03T19:21:00.999+02:00"}

如果直接使用Newtonsoft JSON,我可以传递

new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fff" }

......这给了我所需的一致性。我试图在我们的解决方案中修改输出,这是WCF / ASP.NET + OData的混合,我甚至不知道序列化是通过Json.net而不是通过.NET序列化器发生的(但那会最有可能产生Date(...)值 - 仍然需要调查更多,但我没有看到任何直接引用Json.net。

请注意我自己没有进行序列化!在处理输出时,OData会对此进行介绍。在我的情况下,我实际上没有权力直接调用串行器。上面的代码只是显示输出不一致的示例,这似乎是默认行为。

到目前为止,问题是:

  • 如何全局设置自定义IsoDateTimeConverter(如果使用Json.net)?
  • 如何将自定义格式设置为.NET(JSON和XML)序列化程序?
  • 有没有人能指向RFC,它说如果第二个分数等于0,它会被完全省略?

0 个答案:

没有答案