2009-01-26 73 views
7

我正在開發一個充當簡單項目管理軟件的國際軟件,我正面臨一個問題。這個問題是關於日期/小時和時區。
當從一個時區發送消息到另一個時區時,我可以將UTC(GMT)時間存儲在我的數據庫中,然後根據用戶的時區顯示不同的時間。但是當我只用日期工作時,這是無法完成的。
如果我說任務是由於3月21日。我是否應該認爲這個日期在其他一些國家可以是20或22?你對這個問題有什麼建議?如何處理不同時區的日期和時間?

+0

我可以爲我自己的有關如何測試正確時區處理的相關(但不同)問題放置一個無恥的插件嗎? http://stackoverflow.com/questions/477965/testing-correct-timezone-handling – 2009-01-26 20:13:09

+1

你必須發現它有趣,如果你在標籤「本地化」或「國際化」搜索你只有兩個問題,但如果你搜索「本地化」或「國際化」你會得到堆! – Evan 2009-01-30 04:58:49

回答

4

比方說,紐約的一位用戶將項目的截止日期設置爲「1月26日星期一任何時間」。這意味着「在布魯塞爾的任何時間從1月26日星期一0600年1月26日星期二」和「1月26日星期一從2000年1月26日星期一任何時間」在洛杉磯

因此,在26日星期一2100完成任務是好的布魯塞爾和紐約,但太晚在洛杉磯

一個可能的解決方法是從來沒有隻與日期工作。如果未指定時間,則將其設置爲用戶時區中指定日期的0000小時或2400小時。

用戶可能需要處理奇怪的截止日期/時間,但作爲曾經在國際上工作的人講話,它有點與領土一致。

2

如果不存儲確切的時間,您將無法實現您正在嘗試執行的操作。你根本沒有足夠的信息。

2

如果您沒有時間,則假定時間是應用程序主要語言環境中的業務結束時間,然後按照其他時間翻譯該時間。另一種方法是在當地時間結束營業日並將其調整爲UTC。當沒有指定時間時,每個使用應用程序的人都需要了解你所做的默認時間假設。在大型企業中協調總部可能是最好的,而在當地情況同樣重要的高度分散化的環境中協調當地時間可能是最好的。

1

最簡單的解決方案就是爲每個人顯示相同的日期。截止日期將在最近的時區實際上是午夜。

否則,決定截止日期的默認時間應該在創建任務的時區中,例如, 21日美國東部時間17:00或3月22日00:00 EST,並在當地時區顯示。時區差異會將觀衆推到前一天或第二天。

0

如果您有一個數據庫實例,我會將所有日期存儲在數據庫服務器的日期時間時間戳中。如果您要對行進行時間戳記,請考慮T-SQL中的GetDate()或時間戳日期列的默認值。那麼你有一個單一的參考點,所有的時間。考慮那裏的UTC格式。

然後,訪問日期的所有客戶做自己轉化爲「本地時間」,可以通過類似的東西來解釋:用戶偏好,客戶端計算機上的日期時間戳等

不知道更多,它很難準確地說出解決方案。

1

SQL 2008允許日期數據類型沒有任何時間值與之關聯。這可以讓有人說我需要這個日期完成,但我不在乎它是+/-幾個小時。如果選擇的日期是2009年1月1日,但發生在2009年1月2日凌晨2點他們可能不在意。

當用戶需要的東西在特定日期和時間,如商業上2009/1/1收盤價,那麼你需要將其存儲在一個日期時間爲UTC,並將其轉換爲本地時間客戶端完成。

這將需要很多複雜的出完成的東西時,指示的,它會要麼被附近的某一天或一個特定的時間內完成。

2

如果你不存儲你必須假設被輸入的日期分秒是所需的日期,而不是爲GMT任何調整。把它放在數據庫中。西海岸的人們不得不假定,無論你在世界的哪個地方,到期日都是一樣的。如果您想調整時區,則必須收集更多信息,例如小時,分鐘和秒。

0

您的解決方案取決於您的應用和要求。

我倒是第一家店UTC +在你的數據結構偏移,所以可以很容易地顯示任何時區。

如果任務或會議在倫敦於3月21日下午12點到期,那麼最有可能在3月21日2130在阿德萊德(+0930)發生,但這是一個應用要求,不是任何邪惡的時區相關標準。

如果你想在靈活性最終,添加一個標誌,可以使甚至同時由於在每一個時區或在同一時間,無論你在哪裏(交錯),並相應地顯示事件。

0

您可能希望將日期存儲在可識別時區的日期中。這會幫助你進行計算。例如,SQL Server 2008支持datetimeoffset that does precisely this。或者,如果您使用SQL 2005進行了一點努力,則可以編寫自己的SQL CLR數據類型來支持這一點。

相關問題