2012-03-22 446 views
0

我正在構建一個應用程序,它能夠在任何特定的當地時間將電子郵件發送到世界任何地方。UTC時間,時區,夏令時和夏令時切換日期

例如,我每天的日程安排(本地時間):

  • 8:00 AM - 發送電子郵件到約翰在加拿大多倫多
  • 9:15 AM西部標準時間(澳大利亞) - 發送電子郵件至鮑勃在澳大利亞珀斯
  • 下午10:12 - 發送電子郵件至阿納斯在摩洛哥拉巴特

我希望能夠在一個單一的位置,並在Amazon EC2服務器上執行該代碼(例如聖保羅,巴西)。我也知道多倫多在東部標準時間(UTC - 5h),但從2012年3月11日到2012年11月4日,它在東部夏令時(UTC - 4h)。

我也知道珀斯在西部標準時間(UTC + 8h),沒有夏令時。

我也知道拉巴特是在西歐時間(UTC),但從2012年4月29日到2012年7月20日,以及2012年8月19日到2012年9月30日,它位於西歐夏令時(UTC + 1h)

要跟蹤這些時區,夏令時等的組合,我當然會堅持所有內部服務器時間都是UTC。但是,我需要一些方法來跟蹤每個時區管轄區何時以及如何由於夏令時或(在拉巴特的情況下)齋月來切換時區,然後調整我的crontabs以適應這些更改。

是否有一個權威的Web服務或某個表的集合,這將幫助我保持這些時區更改與我希望每天在相同的本地時間向不同時區的用戶提供電子郵件,同時爲不同的日光切換日期儲蓄?

回答

1

大多數編程語言都允許您訪問時區轉換功能。最基本的只在UTC和服務器的「本地」時區之間起作用,因此您需要一個全功能的時區,例如Python的pytz,它可以讓您指定具有時區名稱的本地時間(例如「America /多倫多「)並將其轉換爲UTC。鑑於此,您不必擔心不同時區的UTC偏移(包括歷史偏移,如果它們已更改),也不需要DST開始結束時間:圖書館將爲您處理它。只要確保你有最新的數據庫,它包含在tzdata包中。

至於你的crontab,如果運行cron的服務器上的本地時區是UTC,那麼你可能是最好的,這樣你可以直接把UTC時間放在crontab中。另一方面,根據您擁有的事件的數量,我會建議讓cron按照固定的時間間隔(例如每5分鐘)運行一次代碼,然後您的代碼根據這些數據計算出需要觸發的事件當前UTC時間和數據庫的內容。那麼服務器的時區是什麼並不重要。