В моем проекте я использую тип данных DateTimeOffset для параметров. Я понял, что смещение всегда «0». Но мне нужно местное время на сервере. Чтобы исправить это, я отправляю timezoneoffset в http-заголовке и прочитаю это при создании параметра DateTimeOffset. Поэтому я создал ModelBinder для преобразования запроса в DateTimeOffset и получить timezoneoffset из заголовка. Это работает, но если какое-либо действие имеет сложный объект с свойством DateTimeOffset (отправка через http POST в веб-api в формате JSON), значит, модельная строка не была выполнена, а смещение в свойстве DateTimeOffset равно «0». Есть ли способ настроить поведение создания объектов из JSON, чтобы я мог получить timezoneoffset из заголовка http?Asp.net Web API DateTimeOffset set offset from http header
public class DateTimeOffsetModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType != typeof(DateTimeOffset))
{
return false;
}
var timezoneOffsetMinutes = actionContext.Request.Headers
.Where(h => String.Equals(h.Key, "TimezoneOffsetMinutes", StringComparison.InvariantCultureIgnoreCase))
.SelectMany(h => h.Value)
.FirstOrDefault()
.ParseAsNullableInteger();
if (!timezoneOffsetMinutes.HasValue)
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Http header dosn't contains 'timezoneoffsetminutes'.");
return false;
}
TimeSpan timezoneOffset = TimeSpan.FromMinutes(timezoneOffsetMinutes.Value);
ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
DateTime date;
if (!DateTime.TryParse(value.AttemptedValue, out date))
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Can't parse parameter '" + bindingContext.ModelName + "' to DateTime.");
return false;
}
date = date.ToUniversalTime();
bindingContext.Model = new DateTimeOffset(date).ToOffset(timezoneOffset);
return true;
}
}
Лично я считаю, что вы используете неправильный подход, используя 'DateTimeOffset'. Почему вы не можете использовать время UTC во всем приложении и настраивать часовой пояс только на стороне клиента? – Dai
Да, я использую UTC раз в своем приложении и храню UTC в базе данных. Но мне нужно смещение от клиента, например. для вычисления правильного времени начала и окончания дня (для получения списка со всеми назначениями назначений дня). –