UTC时间,时区,夏令时和夏令时切换日期

UTC Time, Timezones, Daylight Savings, and Daylight Savings switchover dates

我正在构建一个应用程序,它可以在任何特定的本地时间向世界上的任何地方发送电子邮件。

例如,我的每日计划(本地时间):

  • 上午8:00-向加拿大多伦多的约翰发送电子邮件
  • 上午9:15西部标准时间(澳大利亚)-向澳大利亚珀斯的Bob发送电子邮件
  • 晚上10:12-发送电子邮件至摩洛哥拉巴特的安娜斯

我希望能够在单个位置(例如,S)和AmazonEC2服务器上执行此代码。巴西,圣保罗)。

我也知道多伦多是东部标准时间(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。但是,我需要一些方法来跟踪每个时区管辖区由于日光节约或(在Rabat的情况下)斋月而切换时区的时间和方式,然后调整我的crontabs以适应这些更改。

是否有一个权威的Web服务或一组表可以帮助我保持这些时区更改与我每天在同一本地时间向不同时区的用户发送电子邮件的愿望同步,以节省日光?


大多数编程语言都允许您访问时区转换函数。最基本的只在UTC和服务器的"本地"时区之间工作,因此您需要一个功能完整的时区,例如pytz for python,它允许您使用时区名称(例如"America/Toronto")指定本地时间并将其转换为UTC。考虑到这一点,您不必担心不同时区的UTC偏移量(包括历史偏移量,如果它们发生了变化),也不必担心DST开始-结束时间:库将为您处理它。只要确保您有TZDATA包中的最新数据库。

至于crontab,如果运行cron的服务器上的本地时区是utc,那么最好将utc时间直接放入crontab。另一方面,根据事件的数量,我建议cron每隔一段时间(例如每5分钟)运行代码,然后根据当前的UTC时间和数据库的内容确定需要触发哪些事件。那么,服务器的时区是什么并不重要。


Is there an authoritative web service or set of tables somewhere ...

不,没有什么"权威",但有一些接近的东西。它被称为TZ数据库,目前由IANA监管。它的主页在这里。

它也被称为TZDATA、ZoneInfo、TimeZoneDB、TZDB、Olson数据库或IANA时区数据库。

几乎可以想象到每种语言和平台都有实现。您可以从TZDB的TZ链接文件以及在TimeZone标记wiki中,在StackOverflow上阅读更多内容。