我正在构建一个应用程序,它将能够在任何特定的本地时间向世界上的任何地方发送电子邮件。
例如,我的每日时间表(本地时间):
- 上午8:00-向加拿大多伦多的John发送电子邮件
- 澳大利亚西部标准时间上午9:15-向澳大利亚珀斯的Bob发送电子邮件
- 晚上10:12-向摩洛哥拉巴特的阿纳斯发送电子邮件
我希望能够在一个位置(例如巴西圣保罗)的AmazonEC2服务器上执行此代码。
我也知道多伦多在东部标准时间(UTC-5h),但从2012年3月11日到2012年11月4日,它在东部夏令时(UTC-4h)。
我也知道珀斯是在西方标准时间(UTC+8h),没有夏令时。
我也知道拉巴特在西欧时间(UTC),但从2012年4月29日到2012年7月20日,以及从2012年8月19日到12年9月30日,它在西欧夏令时间(UTC+1h)
为了跟踪时区、夏令时等的这些组合,我当然会坚持所有内部服务器时间都以UTC为单位。然而,我需要一些方法来跟踪每个时区管辖区何时以及如何因夏令时或(在拉巴特的情况下)斋月而切换时区,然后调整我的crontab以适应这些变化。
有没有一个权威的网络服务或一组表格可以帮助我保持时区变化与我每天在同一当地时间向不同时区的用户发送电子邮件的愿望同步,这些用户有不同的夏令时切换日期?
大多数编程语言都允许您访问时区转换函数。最基本的只能在UTC和服务器的"本地"时区之间工作,因此您需要一个功能齐全的时区,例如pytz for Python,它可以让您使用时区名称(例如"America/Toronto")指定本地时间,并将其转换为UTC。考虑到这一点,您不需要担心不同时区的UTC偏移量(包括历史偏移量,如果它们发生了变化),也不需要担心DST开始-结束时间:库会为您处理它。只要确保您拥有tzdata包中的最新数据库即可。
至于您的crontab,如果运行cron的服务器上的本地时区是UTC,您可能会觉得最好,这样您就可以将UTC时间直接放在crontab中。另一方面,根据您的事件数量,我建议让cron以固定的时间表间隔(例如每5分钟)运行您的代码,然后您的代码根据当前UTC时间和数据库的内容来确定需要触发哪些事件。那么服务器的时区是什么就无关紧要了。
某个地方有权威的web服务或一组表吗。。。
不,没有什么"权威",但有一些接近的东西。它被称为TZ数据库,目前处于IANA的监督之下。它的主页在这里。
它也被称为tzdata、zoneinfo、timezonedb、tzdb、Olson数据库或IANA时区数据库。
几乎每种语言和平台都可以实现。您可以在tzdb的tz链接文件中以及StackOverflow上的时区标记wiki中阅读更多内容。