Php 如何获取数据以填充网站上的时区切换小部件?

Php 如何获取数据以填充网站上的时区切换小部件?,php,timezone,Php,Timezone,任务: 允许站点访问者选择时区的时区选择器小部件应该生成,并用合理的数据填充。它应该提供如下选择: GMT-11 (HH:MM actual time in that zone) GMT-10 (...) GMT-1 (...) ... now for the tricky part: GMT (...) GMT+1 (...) ... and then all the way until +12. 当用户选择不同的时区时,服务器应该能够确定要设置的时区。一旦列表中填充了正确的数据,第二部分就

任务:

允许站点访问者选择时区的时区选择器小部件应该生成,并用合理的数据填充。它应该提供如下选择:

GMT-11 (HH:MM actual time in that zone)
GMT-10 (...)
GMT-1 (...)
... now for the tricky part:
GMT (...)
GMT+1 (...)
... and then all the way until +12.
当用户选择不同的时区时,服务器应该能够确定要设置的时区。一旦列表中填充了正确的数据,第二部分就不成问题了

问题:

棘手的部分是获取目前全球使用的实际时区。我知道如何获取整个时区列表,以及如何获取它们的偏移量和当前DST设置。但是,每个时区都有两种变体:常规时间和DST时间

在上面的列表中,我标记了某些“棘手”的部分。这就是像欧洲/伦敦这样的时区。在正常时间内,欧洲/伦敦=GMT,但在夏令时,欧洲/伦敦=GMT+1。。。你能看到问题吗

同样让我困扰的是,并非所有时区都从DST改为常规时间,反之亦然,所以我不能用-11=GMT-11,-10=GMT-10。。。然后应用一些逻辑来定位具有适当时差的时区,然后从那时起将该时区设置为默认时区

我很想听听其他网站如何利用这个时区切换功能,根据用户的选择,列出时区列表和选择正确时区的逻辑?您还想添加或询问其他内容吗?

看看有什么作用。它显示标准时间偏移以及城市名称,例如

(GMT+01:00) Tunis

对我来说,这似乎也是代表他们的一种相当合理的方式。另一方面,我知道一些UI列出了与UTC的当前偏移量以及城市。老实说,无论哪种方式,你都会把人们弄糊涂。

时区数据最常用的来源是数据库——它是公开免费的

正如您自己所注意到的,时区是一个政治/行政实体,由基准偏移量、DST切换日期,甚至关于这些变化的历史数据组成,您需要正确处理历史日期(例如)


因此,tz数据库(以及大多数使用它的应用程序)不是通过基准偏移量来表示时区,而是通过使用它的大陆和大城市的名称来表示时区,通常是使用该特定时区的国家的首都。例如:“欧洲/柏林”或“澳大利亚/达尔文”。

因此,基本上,我会将每个时区的一个主要城市与一个时间偏移关联起来(比如+1伦敦),但等待偏移不同,当这些城市的DST发生变化时,它可能不起作用,由于附近的两个区域在不同的日期更改时间,这两个区域甚至可能有相同的时间。。。我还是不明白。@b先生:你似乎还不明白:在任何给定的时间,有多个不同的时区具有相同的偏移量是完全正常的。偏移量不是时区的有用标识符。这就是为什么tz数据库使用城市名称的原因,他们对此思考了很久。此外,大多数用户可能不知道他们的UTC偏移量,但他们肯定知道他们国家的哪些城市。明白。谢谢你的澄清。这是正确的答案。这里是网络就绪的tz列表,好吧,谷歌不会调整时区名称,不管当前的DST设置如何。我的分区显示为GMT+1,但当前是GMT+2(还是UTC+2?)。当我重新考虑时,它实际上是正确的(大多数时候),因为GMT本身是一个相对术语,UTC是绝对术语。如果是UTC+1,那么就不准确了…@b先生:不,GMT总是(非常接近)UTC。夏天,英国是英国夏令时,而不是格林威治标准时间。但是,是的,谷歌日历会忽略夏令时,显示你的标准时间偏移。@Jon Skeet:哦,我明白了。谢谢你的澄清。@Jon Skeet:当我们在伦敦的时候,你能给我解释一下,在PHP的数据库中,伦敦的偏移量值是如何变化的,从GMT(0/dst关闭),通过BST(3600/dst关闭和3600/dst打开)到BSDT(7200/dst打开)?@b先生:在战争期间,我们有两次夏令时。看见