2016-09-30 2 views
1

У меня есть система, которая используется несколькими пользователями и другими системами в разных часовых поясах. Я принимаю его на Azure. Я хочу сохранить все даты по местному времени, а не время сервера. Я могу это сделать, отслеживая местный часовой пояс каждого клиента, и я компенсирую даты, прежде чем сохранять их в базе данных.предотвратить изменение времени в часовом поясе MVC

До сих пор все хорошо работает, однако, когда даты отправляются обратно в браузер клиента, MVC считает, что они находятся в UTC (это время сервера для всех Azure VM) и смещает часы.

Что является самым эффективным способом предотвратить это? Я попытался установить DateTimeKind на локальный, но это не имело желаемого эффекта. Даты были преобразованы. Думаю, я мог бы передавать даты как строки, но это похоже на взломать. Должен быть лучший способ сделать это.

Ваши предложения высоко оценены.

+0

Если вы заранее знаете часовой пояс своих клиентов, вы найдете его более масштабируемым и более легким в настройке и обслуживании, если вы конвертируете в UTC сохранение локальных дат и конвертируете обратно в конкретную локаль, когда информация должна отображаться. Легче делать математику с датой, когда все синхронизируется с одной стороны сервера часового пояса. –

+0

Что делать, если вы установили datetimekind в utc? – JamieD77

+0

@ JamieD77. Я попробовал это, но без эффекта. По какой-то причине даты всегда преобразуются. – dpdragnev

ответ

1

Итак, после нескольких дней поиска и тестирования я придумал решение, которое решает проблему.

На сервере:

public JsonResult GetModel() 
 
{ 
 
    EOListModel model = _repo.Getmodel(); 
 
    return Json(JsonConvert.SerializeObject(model)); 
 
}

Пара точек здесь: - метод возвращает JsonResult - Мы сериализовать модель в JSON строку

О клиенте:

$.ajax({ 
 
    type: "POST", 
 
    url: "/Controller/GetModel", 
 
    data: null 
 
    }).done(function (result) { 
 
    var m = JSON.parse(result); 
 
    ... 
 
});

результат будет ваша строка JSON и после разбора вы получите ваш объект с датами нетронутыми.

Я не уверен, что это лучший способ достичь этого, но он работает и имеет минимальное количество изменений кода.

Спасибо.

EDIT:

В методе сервера вы также должны проинструктировать Json.NET не добавлять часовой пояс:

return Json(JsonConvert.SerializeObject(model, new JsonSerializerSettings { DateTimeZoneHandling = DateTimeZoneHandling.Unspecified }));

В противном случае Javascript или Moment будет преобразовывать Дата. См. http://www.newtonsoft.com/json/help/html/SerializeDateTimeZoneHandling.htm для более подробной информации.

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