Подтвердить что ты не робот

Предотвратите Json.NET 4.5 из добавления смещения временной зоны при использовании MicrosoftDateFormat

За исключением пользовательской реализации DateTimeConverterBase, существует ли способ сохранить Json.NET 4.5+, когда он настроен на использование DateFormatHandling.MicrosoftDateFormat, от добавления смещения часового пояса для любого не-UTC DateTime он указан?

"\/Date(1333645844276-0600)\/"

Подробнее

Я запускаю проект API с помощью встроенного .NET JavaScriptSerializer для использования Json.NET для генерации JSON. В Json.NET для UTC DateTime сериализация по умолчанию datetime была похожа на версию .NET:

"\/Date(1333645844276)\/"

Для не-UTC, в отличие от JavaScriptSerializer, Json.NET добавляет смещение часового пояса к результатам (-6 для моей области, это время года):

"\/Date(1333645844276-0600)\/"

Вот код, который я использую для переключения Json.NET 4.5+ обратно в формат \/Date(...)\/ (называемый MicrosoftDateFormat):

JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);

Решение показалось, что было бы проще прописать Json.NET для использования другого параметра DateTimeZoneHandling. Я пробовал каждую настройку для DateTimeZoneHandling (Local, Utc, Unspecified и RoundtripKind), и все они поддерживают "-0600" на выходе. Фактически, все они дают одинаковые результаты для не-UTC DateTime.

JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
"\/Date(1333647855743-0600)\/"

Caveat

В идеале, у меня бы все время было в UTC. Я, конечно, планирую сделать это со следующей версией этого API. Поскольку это живой API, не стоит рисковать изменениями выпуска до тех пор, пока не будет выпущена новая версия. Это не похоже на проблему для большинства синтаксических систем JSON, но я не могу рисковать этим изменением, поскольку стандарт JSON официально не говорит о сериализации даты.

4b9b3361

Ответ 1

Кажется, все работает отлично для меня, см. ниже. Моя сборка 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)\/"}

Ответ 2

Я нашел решение для удаления смещения временной зоны от 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"};