Ответ 1
Формат, который вы получаете, - это формат ISO 8601 (см. раздел "Временные и часовые пояса" в Википедии), это просто, что ваши даты, по-видимому, не настроены на время UTC, поэтому вы получаете смещение часового пояса, добавленное к дате а не индикатором часового пояса Z
Zulu.
IsoDateTimeConverter
имеет настройки, которые вы можете использовать для настройки своего вывода. Вы можете автоматически настроить даты в UTC, установив DateTimeStyles
в AdjustToUniversal
. Вы также можете настроить выходной формат, чтобы опустить дробные секунды, если вы этого не хотите. По умолчанию преобразователь не настраивается на время UTC и включает в себя столько десятков значений точности, сколько доступно для секунд.
Попробуйте следующее:
IsoDateTimeConverter converter = new IsoDateTimeConverter
{
DateTimeStyles = DateTimeStyles.AdjustToUniversal,
DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssK"
};
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(converter);
Если ваши даты уже установлены в формате UTC, но DateTimeKind
на них не установлен на Utc
, как это должно быть (например, это Unspecified
), тогда в идеале вы должны исправить свой код, чтобы этот индикатор был установлен правильно до сериализации. Однако, если вы не можете (или не хотите) этого делать, вы можете обойти это, изменив настройки преобразователя, чтобы всегда включать индикатор Z
в формате даты (вместо использования спецификатора K
, который смотрит на DateTimeKind
на дату) и удаляет директиву AdjustToUniversal
.
IsoDateTimeConverter converter = new IsoDateTimeConverter
{
DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
};