WCF DataContractJsonSerializer 如何反序列化 json DateTime?

Posted

技术标签:

【中文标题】WCF DataContractJsonSerializer 如何反序列化 json DateTime?【英文标题】:How does WCF DataContractJsonSerializer deserialize a json DateTime? 【发布时间】:2019-05-07 13:52:45 【问题描述】:

我有2个datetime json字符串,唯一不同的是偏移部分,一个是-08,另一个是-09:

"/Date(946713600000-0800)/"
"/Date(946713600000-0900)/"

当我使用 DataContractJsonSerializer 反序列化它们时

var serializer = new DataContractJsonSerializer(typeof(DateTime));

byte[] byteArray1 = Encoding.UTF8.GetBytes("\"\\/Date(946713600000-0800)\\/\"");
MemoryStream stream1 = new MemoryStream(byteArray1);
var datetime1 = serializer.ReadObject(stream1 );

byte[] byteArray2 = Encoding.UTF8.GetBytes("\"\\/Date(946713600000-0900)\\/\"");
MemoryStream stream2 = new MemoryStream(byteArray2);
var datetime2 = serializer.ReadObject(stream2 );

结果超大我,datetime1和datetime2一模一样! 都是 1/1/2000 12:00:00 AM,datetime1.Kind 和 datetime2.Kind 都是本地的。

我希望他们相差一小时。为什么它们是一样的?

【问题讨论】:

【参考方案1】:

时间部分是两个日期之间的相同值。在您的示例中,偏移量(表示为 -0900 和 -0800)只是表示捕获本地时间的 UTC 偏移量的额外信息。

【讨论】:

-0800 和 -0900 表示 2 个日期时间是在不同的时区创建的。时间部分 946713600000 表示从 UTC 时间 1970:01-01 00:00:00 的偏移量,UTC 时间是 1/1/2000 8:00:00 AM。当您将它们解析到某个时区时,它们应该是不同的,因为它们的 UTC 是相同的。我觉得你的回答没有解释为什么 datetime1 和 datetime2 是一样的。 这些日期与在 pox 和 soap 序列化以及一些特制的 json 格式中遇到的“Z”ulu 日期有点不同。我认为 json/javascript 标准尚未正式化到您所期望的程度,或者序列化程序可能不遵循标准或缺少您所倡导的。

以上是关于WCF DataContractJsonSerializer 如何反序列化 json DateTime?的主要内容,如果未能解决你的问题,请参考以下文章

WCF学习大全

WCF 服务、WCF RIA 服务和 WCF 数据服务之间的区别

WCF / WCF 数据服务 / WCF RIA 服务

无废话WCF系列教程 -- 李林峰

WCF 一步一步 发布 WCF服务 到 IIS (图)

WCF入门教程三[WCF的宿主]