ASP.NET 4.5 OData序列化DateTime到Json缺少时区

时间:2013-08-12 13:44:45

标签: json datetime odata datacontractserializer

当我从Queryable序列化结果时,我正在使用OData和Web API 5.0, DateTime字段始终缺少时区,显示如下:

StartTime: "2013-08-12T10:00:00"

我发现了一些Microsoft OData实现,似乎OData使用自己的消息编写器来进行序列化,所以我无法配置序列化器来生成带有时区的正确日期时间字符串。

有人知道如何解决这个问题吗?

4 个答案:

答案 0 :(得分:1)

如果你没有sql 2008或更高版本,你也可以将nhibernate中的数据类型设置为utcdatetime。然后它假设datetime是utc,这是存储日期时间的唯一有效方式

答案 1 :(得分:0)

经过一番调查,我发现问题不是由OData造成的。

问题是由NHibernate从SQLSERVER数据库读取的DateTime属性不包含TimeZone infor,因此如果没有此信息,OData只能生成没有TimeZone的日期字符串。

请参阅此链接:It gives a very detail explain about NHibernate datetime problem

所以我对这个问题的解决方案是在.NET代码和SQLSERVER 2008中从DateTime切换到DateTimeOffset类型。然后在数据库中,DateTimeOffset列保留TimeZone infor,当被NHiberate读取时,它会将TimeZone信息传递给.NET DateTimeOffset属性。

SQLSERVER 2008支持DateTimeOffset。

答案 2 :(得分:0)

如果您对odata界面中返回的确切数据类型有疑问,请检查网址:http://odata.domain.org/。svc / $ metadata中的元数据。

您将看到本地时间字段的Type Edm.DateTime和UTC字段的Edm.DataTimeOffset。只有UTC才会显示时区信息。

另见OData documentation; 6. Primitive Data Types

答案 3 :(得分:0)

类型" System.DateTime"不包括时区信息,以获得您需要使用的时区" System.DateTimeOffset"。

例如:

    var dateTime = new DateTime(...);
    var dtOffset = new DateTimeOffset(dateTime, new TimeSpan());
    var dtOffset2 = new DateTimeOffset(dateTime, new TimeSpan(1,0,0));

    //Assuming your pc is in the timezone GMT (+00:00)
    // if you .ToString() each of the above you should get something like this ...
    dateTime: "2013-08-12T10:00:00"
    dtOffset: "2013-08-12T10:00:00+00:00"
   dtOffset2: "2013-08-12T10:00:00+01:00"

如果您在Windows中更改了PC的时区,则更改将应用​​于" dateTime"上面的变量,默认情况下变量" dtOffset"将使用windows指定的时区,但在" dtOffset2"变量i指定了时区,以便始终固定为+01:00。

OASIS已从OData标准中删除了DateTime,但我相信Microsoft已将其保留在OData实现中,但是它们的实现假设Offset为机器偏移量。