Вопрос по – Предотвратить Json.NET 4.5 от добавления смещения часового пояса при использовании MicrosoftDateFormat
Если не считать обычаяDateTimeConverterBase
реализации, есть ли какой-то способ сохранить Json.NET 4.5+, когда он настроен на использованиеDateFormatHandling.MicrosoftDateFormat
от добавления смещения часового пояса для любого не UTCDateTime
это дано?
<code>"\/Date(1333645844276-0600)\/" </code>Details
Я переключаю проект API с использованием встроенного .NETJavaScriptSerializer
использовать Json.NET для создания JSON. В Json.NET для UTCDateTime
, сериализация даты и времени по умолчанию была похожа на версию .NET:
<code>"\/Date(1333645844276)\/" </code>
Для не UTC, в отличие отJavaScriptSerializer
Json.NET добавляет смещение часового пояса к результатам (-6 для моей области, это время года):
<code>"\/Date(1333645844276-0600)\/" </code>
Вот код, который я использую для переключения Json.NET 4.5+ обратно на\/Date(...)\/
формат (называетсяMicrosoftDateFormat
):
<code>JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat }; string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings); </code>
Решение казалось, что это будет так же просто, как сказать Json.NET использовать другойDateTimeZoneHandling
установка. Я перепробовал все настройки дляDateTimeZoneHandling
(Local
, Utc
, Unspecified
, а такжеRoundtripKind
) и все они поддерживают "-0600" на выходе. Фактически, все они дают идентичные результаты для не UTCDateTime
.
<code>JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat, DateTimeZoneHandling = DateTimeZoneHandling.Utc }; string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings); "\/Date(1333647855743-0600)\/" </code>Caveat
В идеале я бы все время провел в UTC. Я, конечно, планирую сделать это со следующей версией этого API. Так как это живой API, не стоит рисковать выходным изменением, пока не будет выпущена новая версия. Похоже, что это не проблема для большинства систем синтаксического анализа JSON, но я не могу рисковать этим изменением, поскольку стандарт JSON официально ничего не говорит о сериализации дат.
это работает нормально для меня, см. Ниже. Моя сборка JSON.NET говорит, что это версия "4.5.0.0".
JsonSerializerSettings customJsonSettings = new JsonSerializerSettings()
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
Console.WriteLine(result); // "\/Date(1344249339881)\/"
Возможно, это была ошибка, которая была исправлена?
Явно создавая дату:
var x = new { thedate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Local) };
Console.WriteLine(JsonConvert.SerializeObject(x,
new JsonSerializerSettings() {
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
}));
// {"thedate":"\/Date(1234652400000+0100)\/"}
Console.WriteLine(JsonConvert.SerializeObject(x,
new JsonSerializerSettings() {
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc
}));
// {"thedate":"\/Date(1234652400000)\/"}
Console.WriteLine(JsonConvert.SerializeObject(x,
new JsonSerializerSettings() {
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local
}));
// {"thedate":"\/Date(1234652400000+0100)\/"}
DateTime
для последней версии 9.0.0:
var time = DateTime.Now;
Console.WriteLine(JsonConvert.SerializeObject(time, new JsonSerializerSettings()
{
DateFormatHandling = DateFormatHandling.IsoDateFormat,
DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Unspecified
}));
//"{"thedate": "2016-12-15T09:20:00.9375403"};