За исключением пользовательской реализации DateTimeConverterBase
, существует ли способ сохранить Json.NET 4.5+, когда установлено использование DateFormatHandling.MicrosoftDateFormat
, из добавления смещения часового пояса для любого не-UTC DateTime
дано?
"\/Date(1333645844276-0600)\/"
Я переключаю проект API с использования встроенного .NET JavaScriptSerializer
для использования Json.NET для генерации JSON. В Json.NET для UTC 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)\/"
В идеале я бы уже все свое время указал в формате UTC. Я определенно планирую сделать это в следующей версии этого API. Поскольку это работающий API, не стоит рисковать изменением вывода, пока не будет выпущена новая версия. Похоже, это не проблема для большинства систем синтаксического анализа JSON, но я не могу рисковать этим изменением, поскольку стандарт JSON официально ничего не говорит о сериализации даты.