2012-03-22 444 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时间和数据库的内容。那么服务器的时区是什么并不重要。