XML中的时间

在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))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值