Почему Json.NET DeserializeObject изменить часовой пояс на местное время?
Я использую json.net десериализовать DateTimeOffset
, но он игнорирует указанный часовой пояс и преобразует datetime в локальное смещение. Например,
var content = @"{""startDateTime"":""2012-07-19T14:30:00+09:30""}";
когда deserialised через:
var jsonSerializerSettings = new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.IsoDateFormat, DateParseHandling = DateParseHandling.DateTimeOffset, DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind };
var obj = JsonConvert.DeserializeObject(content, jsonSerializerSettings);
объект будет содержать свойство, содержащее DateTimeOffset
но значение будет 2012-07-19T15:30:00+10:30
т. е. преобразуется в локальный часовой пояс вместо сохранения исходного часового пояса.
есть ли способ получить значение для анализа, как ожидалось, так что в результате DateTimeOffset
свойство будет соответствовать предоставленному значению?
6 ответов
похоже, он игнорирует DateParseHandling.DateTimeOffset
и DateParseHandling.DateTime
. Я бы лог вот вопрос: https://github.com/JamesNK/Newtonsoft.Json
Если вы используете .NET WebApi, вы можете добавить в WebApiConfig.cs
файл для обработки этого глобально в вашем приложении.
config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling =
Newtonsoft.Json.DateTimeZoneHandling.Local;
Это будет специально сказать JsonFormatter
чтобы включить и понять информацию о локальном часовом поясе при сериализации и десериализации даты.
попробуйте использовать этот:
microsoftDateFormatSettings = new JsonSerializerSettings
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Local
};
var items = JsonConvert.DeserializeObject<List<lstObject>>(jsonString, microsoftDateFormatSettings);
Я не знаю, будет ли это работать во всех случаях, но для меня это так. Вы можете попробовать другие значения DateTimeZoneHandling
или поиск дополнительных параметров в Google.
Я не уверен, какую версию вы использовали, потому что в какой-то момент у нас была та же проблема, а затем обновление исправило ее...
ваш код работает неправильно для меня, но если я создаю класс
public class A
{
public DateTimeOffset startDateTime;
}
и звонок
var obj = JsonConvert.DeserializeObject<A>(content, jsonSerializerSettings);
все работает, как ожидалось. Да, это ошибка, да, я не знаю, как получить результат именно так, как вы хотите, но, вероятно, это поможет кому-то другому.
это работает для меня, часовой пояс сохраняется
var jss = new JsonSerializerSettings
{
DateFormatHandling = DateFormatHandling.IsoDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Local,
DateParseHandling = DateParseHandling.DateTimeOffset
};
var responseObj = JsonConvert.DeserializeObject<dynamic>(body, jss);
return responseObj.Select(s => new {
id = s["id"].Value<int>(),
date = s["date"].Value<DateTimeOffset>().DateTime,
});
тело JSON-это что-то вроде этого
[
{
"id": 211,
"date": "2017-10-22T12:00:00+03:00",
"status": 1
},
{
"id": 212,
"date": "2017-10-28T12:00:00+03:00",
"status": 1
}
]
чтобы использовать эти параметры в сериализатор, типа:
var serializerSettings = new JsonSerializerSettings
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Local
};
var serializer = JsonSerializer.Create(serializerSettings);