2013-04-08 65 views
3

我想我可能一直生活在山洞中一段時間​​,因爲DateTime的複雜性只在今天沉沒。我讀過幾篇文章,建議在數據庫中始終將DateTime存儲爲UTC,然後將它們顯示爲視圖中的本地時間。在.Net中存儲並顯示DateTimes的正確方法是什麼?

不過,我當時打的說,它不是簡單的文章,你需要考慮「瞬間」和轉換用戶輸入DateTimeUTC難由於TimeZone Id或使用ToUniversalTime()是不是安全的,或者你可以讓JavaScript發帖UTC DateTime並使用JS顯示當地時間,但如果我有DateTime模型屬性的Razor視圖,該怎麼辦?即使依靠ToLocalTime()顯然不能被認爲是安全的。

我聽說過Jon Skeet的Noda Time,我希望能解決所有這些問題,但我知道他評論說它並不完美。

那麼在地獄裏人們甚至在.Net上使用非常簡單的網絡應用程序呢?

有沒有一個正確的例子,你可以提供或鏈接到哪些帖子,然後呈現時區同情的價值?

看來無知是幸福。

更新:例如,用戶有一個來自jQuery的DateTimePicker,他們選擇一個事件的日期時間。該應用程序的用戶是全球性的,所以如果他們選擇美國東部時間上午10點,英國用戶應該在6點看到該視圖。

+7

或許,如果你多一點告訴我們您的具體使用情況,我們可以瞭解如何正確處理您的具體情況更清晰。 – 2013-04-08 20:10:20

+1

@RobertHarvey,我認爲這是關鍵。不管你想要解決什麼問題,都不要解決那些不在意的問題,只需解決你的使用案例。解決未知未知數是不可能的。 – 2013-04-08 20:13:00

+0

@RobertHarvey新增更新 – Jon 2013-04-08 20:13:34

回答

1

讓我們來看看我們擁有的所有技術: SQL Server(我認爲您使用SQL Server,因爲MS堆棧) - DATETIME類型不存儲時區偏移範圍,所以這不會給我們其他選項,而不僅僅是保持UTC。

.NET爲您提供了一個在DateTime類型中使用時區進行操作的選項。所以你可以加載數據庫的值,並以某種方式將其更改爲用戶時區。這是個好問題,如何確定用戶時區是什麼?好的,如果用戶註冊了大小 - 你可以使用像'你的時區'這樣的設置並存儲給所有用戶(一個分支站點這樣做,比如Sharepoint),所以每次你渲染視圖 - 你使用這個設置,使用正確的時區渲染視圖。這個問題可能是,如果你需要使用緩存 - 你將需要基於用戶時區緩存(不是最好的,呵呵)...

但是如果你有一些匿名用戶你沒有關於他的信息?

讓我們來看看JavaScript。 JavaScript允許您使用時區進行操作。您可以在服務器上呈現所有與日期相關的字符串,如<date>2013-04-08T12:00:00Z</date>,表示UTC的日期,在此onload之後,您可以啓動JS代碼,該代碼將查找所有date標記並將其轉換爲瀏覽器時區。 (我有一篇關於這個問題的文章Developing web application with time zones support,它有很多語法錯誤,對不起)。

因此,對我來說 - 正確的做法是將所有東西都保存在UTC中,直到您不會將其顯示給用戶。只有View應該使用用戶時區中的日期進行操作(在你的情況下,這應該只是JavaScript層),每次你需要發送數據到服務器時 - 你需要將這個日期轉換爲UTC。每次從服務器獲取日期時 - 首先將它們轉換爲瀏覽器時區,然後將其顯示給用戶。

1

我可以告訴你我是怎麼做的。 .NET有一個名爲Kind的屬性。我所做的是在我的數據庫中有一個名爲UserTimeZome的字符串字段,並且在用戶設置中的某處,用戶可以設置他或她的時區。您可以使用this code來列舉一個下拉列表。

一旦用戶選擇了他或她的時區,我將DisplayName存儲在我的數據庫的UserTimeZone字段中。現在我可以將UTC時間轉換爲當地時區,反之亦然。我可以使用ConvertTimeToUtc方法或ConvertTimeFromUtc方法。確保通過創建新的DateTime並在DateTime構造函數上設置Kind來更新Kind屬性。

與此一起,我可以將任何日期/時間轉換爲本地時間或UTC時間。現在,如果您需要使用javascript來完成此操作,而不是來自C#,則使用MomentJs。 MomentJs可以使用UTC functions轉換UTC和本地時間。

我希望這可以幫助你

相關問題