当我从Queryable序列化结果时,我正在使用OData和Web API 5.0, DateTime字段始终缺少时区,显示如下:
StartTime: "2013-08-12T10:00:00"
我发现了一些Microsoft OData实现,似乎OData使用自己的消息编写器来进行序列化,所以我无法配置序列化器来生成带有时区的正确日期时间字符串。
有人知道如何解决这个问题吗?
答案 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才会显示时区信息。
答案 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为机器偏移量。