2015-09-25 99 views
1

我有一个数据库表,其中包含(其他字段)日期和值。 没有为一年中的每一天的记录,下面的子集包含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')。

回答

0

OData V4不包括DateTime作为其标准edm类型。在Web API中,DateTime被映射到DateTimeOffset。

如果你想使用DateTime,请确保你已经设置了TimeZoneInfo,否则,它将使用本地设置。

更多信息请参考odata团队的sample page