我正在尝试将请求从服务器发送到客户端(.Net),该客户端在特定于文化的环境中运行,这会影响日期处于特殊时区。
我正在使用未指定的类型从服务器发送日期,以避免在客户端检索到该日期时将其转换。基本上我只是在服务器端这样转换它:
DateTime dateToSend = DateTime.SpecifyKind(serverSideDate, DateTimeKind.Unspecified);
问题是,当对客户端使用 JsonProtocol 时,日期未得到转换并且得到了正确的处理,而对于 MessagePackProtocol 来说,客户端和服务器端的代码相同完全不同的工作方式-它将日期转换为客户端上特定于文化的时区...
如何避免这种转换,而没有一些黑客解决方案,例如将日期作为字符串传递。
更新:
正如Shaun所建议的那样,我已经通过这种方式在客户端和服务器端都配置了MessagePack,但不幸的是,它仍然无法正常工作:
.AddMessagePackProtocol(options =>
options.FormatterResolvers = new List<MessagePack.IFormatterResolver>()
{
StandardResolver.Instance,
NativeDateTimeResolver.Instance
})
答案 0 :(得分:3)
问题是kind is lost with the MessagePackProtocol。
DateTime
被序列化为MessagePack时间戳格式,它序列化/反序列化UTC并丢失Kind
信息。
该注释继续说明我们可以使用NativeDateTimeResolver
来更改它(尽管有一些限制)。
如果您使用
NativeDateTimeResolver
序列化的本机DateTime
二进制格式,它可以保留Kind
信息,但不能与其他平台进行通信。
正如Chris和Panagiotis所提到的,最好使用DateTimeOffset
。官方Microsoft documentation says this:
DateTimeOffset应该被视为应用程序开发的默认日期和时间类型。
Stack DateTime vs DateTimeOffset上还有很多有用的信息。