在SOA环境中,经常遇到时间,日期错乱的情况
明明在A端发的日期是2012-05-11,B端却收到2012-05-10, 什么情况?
原因在于
.net的反序列化会自动把DateTime类型的字段,转为本地时间
e.g.
如果B所在的服务器,本地时区设置为太平洋时间 -7区:
"2012-10-21" 转化为 "2012-10-21 12:00:00 AM"
"2012-10-21-07:00" 转化为 "2012-10-21 12:00:00 AM"
"2012-10-21+00:00" 转化为 "2012-10-20 17:00:00 PM"
"2012-10-21+08:00" 转化为 "2012-10-20 09:00:00 AM"
经过反序列化,21号就神奇地变成了20号
再经过下面的代码
date.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture))
date.ToString("MM/dd/yyyy", DateTimeFormatInfo.InvariantInfo))
20就这样被传入了C端
原本以为上面的代码会转成UTC时间再tostring, 其实不会,跟不跟 CultureInfo.InvariantCulture都没有关系,时间不会变,变的只是格式,连接符
解决方案:
1. 设属性的类型为String, 不要使用DateTime类型,在发送前用
date.ToString("yyyy/MM/dd", DateTimeFormatInfo.InvariantInfo))转为String
接收方用:
Convert.ToDateTime(dateString, DateTimeFormatInfo.InvariantInfo);转为DateTime.
2. 使用DataContractSerializer, not XMLSerializer,前者在序列化时,不带时区
3 如果xsd已经确定,不能更改,属性的类型必须为DateTime,
发送前,先转为UTC时间,接收时 date.ToUniversalTime().ToString("yyyy/MM/dd", DateTimeFormatInfo.InvariantInfo))