2014-08-28 76 views
2

我目前正在考慮實現DateTime本地化的方法,同時考慮到用戶時區和用戶文化來決定我們的MVC4應用程序的本地時間和日期格式。ASP MVC - 使用時區和文化處理日期時間本地化

的目的(如果可能):

  1. 轉換一個用戶本地日期時間爲UTC對控制器的使用和數據庫
  2. 在所有的ViewModels/JsonResults日期,轉換UTC到用戶本地的DateTime並將其文化格式用於視圖中,並用於第三方控件的JSON Feed

我們系統中的用戶都有帳戶,他們專門設置了他們的時區和文化設置,所以我將永遠有權訪問這些元素。

地方 - > UTC(解決)

對於1,我有一個自定義的模型綁定,是以用戶的本地時間和轉換時間爲UTC,預期其工作。

UTC - >本地

對於2.我不知道什麼是最好的方式來處理這一點。我真的想攔截所有的DateTime屬性,並將它們的值從UTC格式化爲用戶本地時間/文化,然後它們返回到View或作爲JSON對象返回。

可以有一種通用的方式,我這樣做使用像ActionFilter的東西?如果我能找到一種方法在一個可以格式化DateTime以便在View和JSON結果中使用的地方,那將是非常好的。

我知道我可以將它分開,並在Display/Editor模板中執行此操作,但是我接下來遇到的問題是第三方控件的JSON Feed中返回的UTC日期。

回答

1

的幾點:

  • 是的,你可以使用一個動作過濾器,但將作出該無處不在您的應用程序需要的工作方式相同的假設。情況可能並非總是如此。

    例如,管理用戶可能使用了其中一個控制器,該用戶可能會在用戶的時區中顯示值,而不是他們自己的值。

    或者你的屏幕可能有一個與未來事件的調度工作。在這些情況下,在UTC中存儲而不是或將其轉換爲用戶的時區 - 但要將數據保留在事件的原始時區中。

  • 在我的MVC應用程序中,我更喜歡在控制器和/或模型中完全控制它。如果我想將一個值轉換爲特定的時區,我在返回之前在控制器中操作模型的屬性。

  • 您可能會考慮在模型和控制器中使用DateTimeOffset而不是DateTime。當了解不同的值與UTC和UTC之間的關係時,這會使事情變得更容易一些。偏移量可以保持不變,但DateTimeKind被隱藏起來並經常丟失。另見DateTime vs DateTimeOffset

  • 如果您正在存儲在一個數據庫如SQL Server中,那麼您的可能也在那裏使用datetimeoffset。有時這是有道理的,有時它仍然是有意義的存儲datetimedatetime2。考慮你的選擇,並選擇適合你的東西。

  • 文化真的只對定期的意見很重要,你會爲用戶格式化。 JSON響應應該(最好)是ISO8601格式,包括偏移量。它應該使用InvariantCulture