Почему 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);