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