当我连载时,我所有的日期都将是本地时间,以便维护 与读取/写入同一数据库或执行服务器到服务器集成的遗留应用程序的向后兼容性。 但我想为我的消费者的 web api 生成 UTC(ISO 格式)字符串,因为它们可以在我的国家/地区的任何地方。 因为我住在巴西,而且这个国家有多个时区,所以我确实不得不处理这个困惑的语言环境。
当我反序列化时,由于向后兼容性,我想将 utc 格式的字符串转换为本地格式。
巴西(巴西利亚时间)偏移 -03:00,则:
当 web api 消费者输入:“...T18:00:00.000Z”时,在 web api 端,DateTime
时间需要变为“15:00:00”本地格式。
当 web api 输出完全相同的“15:00:00”DateTime
时,序列化程序应该将该时间转换回 utc 格式的“...T18:00:00.000Z” .
如果可能的话,我想要一个应用程序范围的解决方案,IOW,我不想用自定义 JsonConverter 装饰每个类或属性
你能给我一些建议吗?
最佳答案
您描述的是 DateTimeZoneHandling.Local
的行为,至少在 7.0.1 版本中是这样,这是回答此问题时的最新版本。
实际上有一个小区别:当 DateTime
被序列化时,JSonConvert
er 将产生偏移格式的时间 [15:00-03 :00
] 而不是 UTF 格式 [18:00Z
]。这是预期的,我相信(至少对我有意义),因为 SerializerSettings 中的格式是 DateTimeZoneHandling.Local
,如果它是 DateTimeZoneHandling.Utc
,它会产生18:00Z
,符合预期。
当 DateTime 被反序列化时,UTC 格式的值(例如 "2015-01-01T18:00:00.000Z"
)将正确地变为与 new DateTime(2015, 1, 1, 15, 0, 0, DateTimeKind.Local)
。
要配置 JsonConvert
,请在 WebApiConfig
的 Register()
方法中添加以下代码:
using Newtonsoft.Json;
...
public static void Register(HttpConfiguration config)
{
var settings = config.Formatters.JSonFormatter.SerializerSettings;
settings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
settings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
}
免责声明:测试结果来自 -03:00 偏移量。 (巴西时间)
关于c# - 如何设置 Json.Net 序列化程序以自定义方式运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31686569/