За исключением пользовательской реализации 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 официально не говорит о сериализации даты.