2015-09-25 3 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 
} 
... 

Обратите внимание на дубликат 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» в конце отметки времени?).

ответ

0

OData V4 не включает DateTime в качестве стандартного типа edm. В Web API DateTime сопоставляется с DateTimeOffset.

Если вы хотите использовать DateTime, убедитесь, что вы установили TimeZoneInfo, иначе он будет использовать локальную настройку.

Дополнительная информация, пожалуйста, обратитесь к sample page от команды odata.

Смежные вопросы