У меня есть таблица базы данных, содержащая (среди других полей) дату и значение. Существует запись на каждый день года, наборы к югу ниже содержит диапазон дат 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
}
...
Обратите внимание на дубликат 29 марта? С этого момента идентификатор не синхронизирован с исходными данными, а также отсутствует 25 октября.
Мое предположение заключается в том, что когда данные сериализуются в JSON, происходит что-то с локальным временем UTC.
Если я удалю OData из уравнения и использую обычный веб-API, я не могу воссоздать проблему, похоже, что проблема связана с OData или форматировщиком JSON.
Что мне нужно сделать, чтобы получить даты по мере их появления в исходных данных?
Код (если применимо):
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);
}
}
UPDATE 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 и веб-API, wher e первый не поддерживает DateTime
, а последний - делает.
ОБНОВЛЕНИЕ 2
DateTimeOffset
имеет LocalDateTime свойство, которое содержит правильные даты в соответствии с исходными данными. Я не понимаю, что исходные данные не содержат на нем никакой информации о часовом поясе, а возвращаемый JSON - это UTC (см. «Z» в конце отметки времени?).