我有一个数据库表,其中包含(其他字段)日期和值。 没有为一年中的每一天的记录,下面的子集包含2015年的日期范围时夏令时(英国夏令时)开始和结束:Web API OData - 日期和夏令时
Source Data:
ID Date (dd/mm/yyyy) Value
... ... ...
8E5 27/03/2015 600
8F5 28/03/2015 600
905 29/03/2015 600 // DST Starts
915 30/03/2015 600
925 31/03/2015 600
... ... ...
615 24/10/2015 600
625 25/10/2015 600 // DST Ends
635 26/10/2015 600
645 27/10/2015 600
我使用的Web API的OData返回数据从这张表中,这里是同一日期范围内的JSON响应:
...
{
"Id":"8E5",
"CostDate":"2015-03-27T00:00:00Z",
"Value":600
},{
"Id":"8F5",
"CostDate":"2015-03-28T00:00:00Z",
"Value":600
},{
"Id":"905",
"CostDate":"2015-03-29T00:00:00Z",
"Value":600
},{
"Id":"915", // Duplicate 29/03/2015, ID field out of sync
"CostDate":"2015-03-29T23:00:00Z",
"Value":600
},{
"Id":"925",
"CostDate":"2015-03-30T23:00:00Z",
"Value":600
}
...
{
"Id":"625",
"CostDate":"2015-10-24T23:00:00Z",
"Value":600
},{
"Id":"635", // Missing 25/10/2015?
"CostDate":"2015-10-26T00:00:00Z",
"Value":600
},{
"Id":"645",
"CostDate":"2015-10-27T00:00:00Z",
"Value":600
}
...
请注意3月29日?从那天起,该ID与源数据不同步,并且10月25日也失踪。
我的假设是,当数据被序列化为JSON时,本地vs UTC时间会发生一些事情。
如果我从等式中删除OData并使用正常的Web API,我无法重新创建问题,看起来问题出在OData或JSON Formatter上。
我需要做些什么来获取日期,因为它们出现在源数据中?
代码(如相关):
public class BudgetDto
{
[Key]
public string Id { get; set; }
public DateTime CostDate { get; set; }
public double Value { get; set; }
}
public class BudgetsController : ODataController
{
private IBudgetService BudgetService { get; }
public BudgetsController(IBudgetService budgetService)
{
BudgetService = budgetService;
}
[EnableQuery(PageSize = 400)]
public IQueryable<BudgetDto> Get(ODataQueryOptions<BudgetDto> queryOptions)
{
return BudgetService.Budgets(queryOptions);
}
}
更新1
此链接似乎揭示这一问题的小光:
http://blogs.msdn.com/b/bclteam/archive/2010/11/28/time-travel-with-net-or-datetime-datetimeoffset-and-the-lost-dst-hour-greg.aspx
虽然我的模型使用DateTime
为类型,OData切换到DateTimeOffset
,这也许解释了OData和Web API之间的区别, e前者不支持DateTime
,后者不支持。
UPDATE 2
的DateTimeOffset
具有LocalDateTime属性,该属性包含正确的日期按照源数据。我不明白的是,源数据没有任何时区信息,并且返回的JSON是UTC(请参阅时间戳结尾处的'Z')。