2011-12-03 103 views
3

我正在開發一個系統,希望使用單個板上的消息來生日。使用MongoDB和PHP。MongoDB中的PHP時區偏移量

現在真正的問題是當系統每天使用CRON Job生成消息並檢查是否有任何生日時,如果是,則系統發佈它。同時每個用戶都指定了他們的默認時區以及使用當前爲+5.30(IST)的系統時間生成的消息。

因此,假設系統在12月3日12點生成一條消息,DB中存儲的時間戳將按照系統的時區。當用戶訪問它顯示的東西時,但我需要按照用戶的設置顯示它。

請參閱附件截圖。 Datetime Problem

回答

0

一種方法是在設置日期和時間時使用服務器時間。目前看起來就像您的用戶PC的設置和服務器顯示的時間。我認爲只有AJAX纔有可能?

只設置並顯示服務器時間,並給用戶選擇設置他們的時區。

+0

但是如何實現呢?假設用戶的時區是+8.30,服務器的是+5.30,所以如果我在2011年12月3日下午7:00進行了一些操作,它應該在2011年12月3日晚上10點向用戶顯示。 – Wh0RU

1

您的服務器代碼應該使用UTC,因此您不需要關心服務器的位置。使用本地時間會導致問題,因爲某些時間點不存在,或存在兩次(DST跳轉)。但是,當您的服務器代碼代表用戶行事時,它必須遵守該用戶的時區設置,因此您應該首先查看該時區。然而,這取決於您的具體要求。

我建議你看看Joda Time的問題和與時區有關的解決方案。這是一個Java庫,但也許有一個PHP的等價物,或者你可以從他們的來源中學習。

現在,您的要求:您需要確定您想要達到的究竟是什麼。示例:來自洛杉磯的用戶在澳大利亞有一位朋友。考慮到巨大的時差,你什麼時候通知LA用戶澳大利亞的生日?如何處理2月29日出生的人?如果洛杉磯用戶目前在東京?我會說在這個階段讓你的生活變得輕鬆,因爲精確和及時的通知會使問題增長出奇地複雜

您可能需要MongoDB中的結構來存儲生日,因爲生日是一個反覆發生的事件,而不是一個時間點。您可以使用UTC存儲下一個通知時間,但並不那麼簡單 - 請繼續閱讀。

此外,您需要爲每個用戶存儲時區。如果您需要精確度,那麼這些時區也很煩人:它們的偏移量可能會發生變化,並且其DST規則會發生變化(有時會在短時間內發生變化)。因此,只存儲一個TimezoneId是有意義的。這就是提前一年對「下一次通知時間」進行非規範化可能是一個挑戰的原因。

您的確切要求將塑造代碼和數據結構。我的建議是:將生日視爲經常性,長期運行的本地時間活動。存儲時區ID和日期(沒有時間!)。你的生日不是'附加'到時區,因爲它沒有任何意義 - 當你移動到不同的時區時,生日'跟隨你'。

在數據庫中存儲下一個通知日期和時間(UTC)確實很有意義,因此您的通知查找代碼很容易,但請記住,如果用戶更改了他時區或用戶的政府突然決定引入DST規則。作爲一個方面說明,你的cron應該比每天更頻繁地運行,至少每小時我會說。