UTC 时间、时区、夏令时和夏令时切换日期
Posted
技术标签:
【中文标题】UTC 时间、时区、夏令时和夏令时切换日期【英文标题】:UTC Time, Timezones, Daylight Savings, and Daylight Savings switchover dates 【发布时间】:2012-04-07 09:21:53 【问题描述】:我正在构建一个应用程序,它能够在任何特定的当地时间向世界任何地方发送电子邮件。
例如,我的日程安排(当地时间):
8:00 AM - 向加拿大多伦多的 John 发送电子邮件 9:15 AM 西部标准时间(澳大利亚) - 向澳大利亚珀斯的 Bob 发送电子邮件 10:12 PM - 向摩洛哥拉巴特的 Anas 发送电子邮件我希望能够在单个位置(例如,巴西圣保罗)的 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。但是,我需要一些方法来跟踪每个时区管辖区何时以及如何由于夏令时或(在拉巴特的情况下)斋月切换时区,然后调整我的 crontab 以适应这些变化。
是否有权威的网络服务或表格集可以帮助我保持这些时区更改与我希望每天在同一本地时间向不同时区的用户发送电子邮件的愿望保持同步,这些用户具有不同的夏令时切换日期?
【问题讨论】:
【参考方案1】:大多数编程语言都允许您使用时区转换功能。最基本的只能在 UTC 和服务器的“本地”时区之间工作,因此您需要一个功能齐全的时区,例如 Python 的pytz,它可以让您使用时区名称指定本地时间(例如“ America/Toronto") 并将其转换为 UTC。鉴于此,您无需担心不同时区的 UTC 偏移量(包括已更改的历史偏移量),也无需担心 DST 开始结束时间:图书馆将为您处理。只需确保您拥有最新的数据库,它包含在 tzdata 包中。
至于您的 crontab,如果运行 cron 的服务器上的本地时区是 UTC,那么您可能最好,这样您就可以将 UTC 时间直接放在 crontab 中。另一方面,根据您拥有的事件量,我建议让 cron 定期运行您的代码(例如每 5 分钟一次),然后您的代码根据当前的 UTC 时间和数据库的内容。那么服务器的时区是什么都没关系。
【讨论】:
【参考方案2】:某处是否有权威的网络服务或一组表格...
不,没有什么“权威”,但有一些接近的东西。它称为TZ database,目前由IANA 监督。 Its home page is here.
它也被称为 tzdata、zoneinfo、timezonedb、tzdb、Olson 数据库或 IANA 时区数据库。
几乎所有你能想象到的语言和平台都有实现。您可以在the tz-link file from the tzdb 和timezone tag wiki, here on *** 中阅读更多内容。
【讨论】:
以上是关于UTC 时间、时区、夏令时和夏令时切换日期的主要内容,如果未能解决你的问题,请参考以下文章