2015-09-25 101 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