【发布时间】:2019-05-02 20:02:31
【问题描述】:
我有一个包含日期(以及其他数据)的动态对象。
其中一些日期具有 Kind UTC,而其他日期具有 Kind Local,例如:
var dynamicObject = new
{
utcDate = DateTime.UtcNow, //This one has Kind = DateTimeKind.Utc
localDate = DateTime.Now //This one has Kind = DateTimeKind.Local
}
然后我有一个 JsonSerializer,其工作方式如下:
var isoDateTimeConverter = new IsoDateTimeConverter();
isoDateTimeConverter.DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'";
// ^
// Notice this
var serializerSettings = new JsonSerializerSettings();
SerializerSettings.Converters.Add(isoDateTimeConverter);
var response = context.HttpContext.Response;
var writer = new JsonTextWriter(response.Output) { Formatting = Formatting };
var serializer = JsonSerializer.Create(serializerSettings);
serializer.Serialize(writer, dynamicObject);
writer.Flush();
这样创建一个 JSON 字符串:
{
"utcDate":"2019-05-02T19:52:20Z",
"localDate":"2019-05-02T15:52:20Z"
}
这是预期的,因为我的 isoDateTimeConverter 当前是如何定义的。
但我想序列化如下:
{
"utcDate":"2019-05-02T19:52:20Z",
"localDate":"2019-05-02T15:52:20" // <--- no Z
}
意味着我想添加一个“Z”仅当 DateTime 的种类是 Utc 时。
IsoDateTimeConverter 和/或JsonSerializerSettings 可以做到这一点吗?
【问题讨论】:
-
你试过不设置
DateTimeFormat吗? -
是的,它确实根据种类正确添加了 Z。但是...它还添加了毫秒,使其成为非 ISO 8601 格式,例如:
2019-05-02T16:12:26.7134289-04:00,或:2019-05-02T20:12:26.7134289Z -
毫秒对 ISO 8601 有效...You could also use
Kinstead of'Z' -
-04:00部分在 ISO 8601 中是否有效?
标签: c# jsonserializer