2014-05-25 59 views
2

在開發應用程序時,我遇到了客戶端和服務器之間的時間一致性問題。讓我先描述一下這個應用程序。使用實體框架ORM(MS SQL服務器用作數據庫引擎)(Code First方法)。在客戶端頁面上,我有一個接受日期和時間的簡單表單。當我想提交表單和發送數據的下一個步驟發生:始終在服務器和客戶端上存儲DateTime

  • 用戶按下提交(日期與當前用戶的時區從而存儲爲一個javascript日期對象)
  • 包含所有的對象將要發送的表單數據(包括該日期和時間)序列化爲JSON。 JSON.Stringify所做的是將日期對象轉換爲該日期的字符串表示形式,但格式爲UTC。該日期存儲在數據庫中。
  • 當用戶請求這個數據時,返回一個JSON字符串;但是服務器以正常格式(不是UTC)返回日期。 JSON.parse不會將表示日期的字符串轉換爲javascript對象。所以當我解析一個日期時,我得到了錯誤的值。

示例:假設用戶輸入05/25/2014 22:20:00,並且其時區偏移量爲GMT +3。現在用戶提交的表格日期將被轉換爲UTC:05/25/2014 19:20:00,並且這將被保存到數據庫中。用戶然後請求數據並得到錯誤的日期和時間 - 19:20:00。

我意識到我可以通過手動解析客戶端上的日期來實現正確的處理。但有什麼辦法可以提供按日期的一致性:

  • 告訴EF治療日期UTC和UTC格式
  • 返回它告訴JSON解串器解析日期

我認爲這將提供日期一致性。當然,我想用UTC來存儲日期 - 這是主要想法。

回答

0

我相信這是一個DateTimeJSON.parse問題相結合,而不是從EF。

既然你知道你存儲在數據庫爲UTC日期,我們知道,Web服務器檢索時會自動轉換成DateTimes「本地」之類的時區時,也許你可以在DateTime轉換回UTC然後將其作爲JSON字符串返回。

var dateTimeToReturn = TimeZoneInfo.ConvertTimeToUtc(theDateTimeRetrievedFromTheDB, TimeZoneInfo.Local)).ToString(); // or one of the other string conversion methods/formatting provided by DateTime, in the form you want displayed to the user 

然後返回dateTimeToReturn只要你想顯示的字符串,而只是有視圖代碼顯示它是沒有解析它。

+0

也許我誤解了你,但是這樣我們會在時區服務器中設置日期,而不是在客戶端機器上設置日期。所以在我看來這應該在客戶端完成。但是,這又是一項例行的手工工作。 – seeker