2008-12-01 44 views
8

我正在清理大型代碼庫中沒有人關注本地時間與UTC時間的問題。替代ASP.NET WebMethod參數的DateTime序列化

我們想要的是一種全局忽略發送到和來自ASP.NET Web服務的DateTime對象的時區信息的方法。我有一個檢索操作的解決方案。數據僅在數據集中返回,我可以查找DateTime列並將DateTimeMode設置爲Unspecified。這解決了我在數據集內傳遞的所有數據的問題。

但是,DateTime對象通常也直接作爲參數傳遞給Web方法。我想刪除任何傳入的時區信息。我不想通過我們的客戶端代碼進行搜索,而是使用DateTime.SpecifyKind(..)將所有的DateTime變量設置爲Undefined,我想做一些全局ASP.NET覆蓋來監視傳入的參數並去掉時區信息。

這樣的事情可能嗎?還是有另一種更簡單的方法來做我想做的事情?

只是重申 - 我不在乎時區,每個人都在同一個時區。但是有幾個用戶的機器配置錯誤,時區錯誤等等。因此,當他們在2008年7月1日發送時,我將在服務器端獲得2008年6月30日22:00:00,它會自動將其從它們的轉換中本地時間到服務器的本地時間。

更新:另一種可能性是,如果可以在客戶端.NET代碼上進行更改,以改變Kind'Undefined'的DateTime對象被序列化的方式。

回答

4

我在很多應用程序,服務和不同的平臺上(.NET,Java等)經常處理這個問題。請相信我,你不想假裝你不關心時區的長期後果。在追逐很多難以解決的難題和昂貴的錯誤之後,你會希望你已經關心了。

因此,您應該捕獲正確的時區或強制某個特定的時區,而不是剝離時區。如果您合理可以,請獲取固定的各種數據源以提供正確的時區。如果它們超出了你的控制範圍,那麼強制它們到服務器的本地時區或UTC。

一般的行業約定是強制所有東西都是UTC,並將所有生產硬件時鐘設置爲UTC(即服務器,網絡設備如路由器等)。然後,您應該翻譯至用戶界面中用戶的本地時區。

如果你現在正確地修復它,它可以很容易和便宜。如果你故意進一步破壞它,因爲你認爲這樣會更便宜,那麼當你必須解開可怕的混亂時,你將沒有任何藉口。

請注意,這與Strings的常見問題類似:沒有純文本(沒有字符編碼的String),也沒有普通(無時區)時間/日期。否則,假裝是許多痛苦和心痛,以及令人尷尬的錯誤。

+0

不,我們想剝離時區信息。我們無法訪問客戶端安裝,由於許多不同的應用程序訪問數據,我們無法將預先存在的數據庫數據更改爲UTC時間。如果有人從日期選擇項目中選擇7月1日,我們不能在6月30日前將其發送到服務器。 – Clyde 2008-12-01 20:17:00

+0

但這並不需要反對票。答案在問題範圍內是合理的(問題沒有指定限制)。 – 2008-12-02 22:57:50

1

好的,我對此有一個解決方法,這取決於我只需要日期時間的日期部分的事實。我重視這個屬性的每一個日期或日期時間參數系統

<XmlElement(DataType:="date")> 

這改變所產生的WSDL有S型:日期不是s:日期時間。 (請注意,只是具有類型的。NET方法參數是一個Date而不是DateTime沒有完成這個)。所以客戶現在只發送日期時間的日期部分,沒有時間信息,沒有時區信息。

如果我需要發送一個日期和時間值到服務器,我將不得不使用一些其他的解決方法,比如把它作爲一個字符串參數。

1

我也有時區信息的問題。問題是我已經提供UTC的日期時間字段。然後序列化發生,並且本地偏移成爲日期/時間的一部分。我們在不同時區的供應商的日期/時間相當混亂。我通過在用於填充我的數據集的select語句中的datetime字段上使用tsql convert函數解決了此問題。這將字段轉換爲字符串變量,該字符串變量在客戶端自動轉換爲日期時間值。如果您只想傳遞日期,則可以使用101代碼來提供日期。我使用126來提供日期和時間,以確切顯示它在我的數據庫列中的顯示方式,並清除了時區信息。