我有一個數據庫表,其中包含(其他字段)日期和值。 沒有爲一年中的每一天的記錄,下面的子集包含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')。