Не уверен, что я понимаю. Javascript внутренне сохраняет все свои даты в виде нескольких миллисекунд с 1 января 1970 года 00:00:00 по UTC. Затем ваш браузер форматирует эти даты в локальном часовом поясе браузера.Но то, что отправляется на сервер/с сервера, всегда является сериализацией ISO8601 фактической даты javascript. Этот формат позволяет представить «точный» момент времени. Этот момент времени будет отформатирован по-разному в зависимости от часового пояса, в который он отформатирован, но сам момент времени не изменяется.
Таким образом, чтобы уточнить, Breeze НЕ меняет даты в любом случае, за исключением случая дат, отправленных с сервера без временной зоны смещения (другой вопрос, который обсуждался в других сообщений на этом форуме.). Я точно не знаю, что вы испытываете, но ваш комментарий о том, что «Сервер настроен на правильный часовой пояс + 1:00.», Меня смущает. Часовой пояс сервера относится только к форматированию даты, а не к ее фактическому значению.
Однако Breeze поддерживает несколько точек перехвата как на сервере, так и на клиенте.
На сервере, если вы используете ASP.NET WebApi или WebApi2, вы можете создать собственную реализацию класса BreezeConfig. BreezeConfig определяет поведение по умолчанию; вы можете подменить свое собственное поведение, исходя из него и переопределяя его виртуальные методы. Breeze.NET обнаружит ваш подкласс среди сборок, на которые ссылается ваш проект, и используйте его вместо BreezeConfig.
Чтобы использовать BreezeConfig для настройки сериализатора Json.Net с определенными настройками. См. http://james.newtonking.com/json/help/index.html. Вы можете заменить эти параметры, написав подкласс BreezeConfig, который переопределяет метод в соответствии с «CreateJsonSerializerSettings», как показано в следующем примере:
public class CustomBreezeConfig : Breeze.WebApi.BreezeConfig {
protected override JsonSerializerSettings CreateJsonSerializerSettings() {
var baseSettings = base.CreateJsonSerializerSettings();
// Default is DateTimeZoneHandling.RoundtripKind - you can change that here.
// baseSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
return baseSettings;
}
Если изменить это, то вы также, вероятно, нужно заменить Бриз клиентский метод breeze.DataType.parseDateFromServer. Например, если вы хотите обрабатывать все даты, сериализованные с сервера как локальные, вы можете сделать что-то вроде следующего.
var _utcOffsetMs = (new Date()).getTimezoneOffset() * 60000;
// change to parse date as local
breeze.DataType.parseDateFromServer = function (source) {
var dt = breeze.DataType.parseDatesAsUTC(source);
if (breeze.core.isDate(dt)) {
dt = new Date(dt.getTime() + _utcOffsetMs);
}
return dt;
};
Обратите внимание, что я только объясняю настройки точек бриза здесь. Вероятно, это не точное решение вашей проблемы.
Есть ли способ справиться с «Датами только», чтобы избежать проблемы с часовым поясом? Мне не нужен временной/часовой пояс, поскольку я имею дело с датами установления, такими как дата рождения, занятость с тех пор и т. Д. – Patrick
Я думал об этом вчера и пришел к выводу, что это не вариант, по крайней мере, для моего дизайна. Основная проблема заключается в том, что если вы отключите время от UTC Z datetime, это приведет к дате, которая не будет такой, какой ожидает пользователь. Например, пользователь в Лондоне входит 1 июня 2013 года; это отправляется по проводу как 2013-05-31 23:00:00; за исключением того, что в течение 31 мая 2013 года будет сохранено время отгонки. Чтобы убрать время, вам понадобится дата-время, отправленное с смещением часового пояса клиента - например, 2013-06-01T00: 00: 00 + 01 – Christian
Патрик, изучите ответ Джея, он прав. Однако я * думаю *, что может сбить с толку, это время, которое вы видите, хранящееся в db. Дата 1 июня 2013 года 12:00 утра хранится как 2013-05-31 23:00:00. Хотя это выглядит некорректно (на 1 час), это НЕ. Это на 100% точнее - это время UTC ZTC. Согласно ответу Джей, это значение, когда оно отправляется обратно клиенту, будет отображаться в более знакомой стоимости 1 июня 2013 года 12:00. Что мне не нравится *, так это то, что значение в db можно сохранить как 2013-06-01 00: 00: 00 + 01. Это выглядит более знакомым, а также сохраняет ценную информацию - часовой пояс клиента – Christian