c# - 如何设置 Json.Net 序列化程序以自定义方式运行?

标签 c# datetime asp.net-web-api json.net locale

当我连载时,我所有的日期都将是本地时间,以便维护 与读取/写入同一数据库或执行服务器到服务器集成的遗留应用程序的向后兼容性。 但我想为我的消费者的 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 被序列化时,JSonConverter 将产生偏移格式的时间 [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,请在 WebApiConfigRegister() 方法中添加以下代码:

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/

相关文章:

php - 如何将整数转换为日期时间?

javascript - knockout 从输入到函数的发送值

c# - 你能定义一个接口(interface),使得实现它的类必须包含一个也是该类的成员吗?

c# - 无法加载文件或程序集 'System.Spatial' 或其依赖项之一

javascript - 一个对象声明中的两个 Date.now()

asp.net-web-api - ASP.net Core RC2 Web API POST - 何时使用 Create、CreatedAtAction 与 CreatedAtRoute?

c# - ASP.NET Core 中枚举的自定义验证器

c# - 如何在C#中刷新饼图

c# - 如何截断列表?

javascript - setFullYear 不设置 Date 对象的小时/分钟/秒