我一直在寻找一种方法来显示一个看起来应该如下所示的时区列表:
我找到了显示缩写列表的方法,使用gmt列表,但我如何获得中欧时间等名称
我只能找到名字如下的名单:欧洲/阿姆斯特丹,欧洲/柏林等。这正是我不需要的。
事实上,我知道我可以自定义选择,但我更喜欢用php创建这样的列表。
答案 0 :(得分:3)
您展示的示例列表看起来就像是U.S. Naval Observatory's Time Service Dept.提供的数据。他们已经更新了像“苏联3区”这样的名字,被称为“俄罗斯联邦三区”。但这些只是管理员自己对他们认为应该命名时区的个人解释。他们无论如何都不是官方。
如果您在网上搜索,您会发现很多其他静态网站(例如here和here),这些网站似乎认为这些网站在某种程度上是官方的并且是一成不变的。事实并非如此。我的意思是,如果你住在俄罗斯,你认为你真的会说你遵循“时区3”吗?不,你可能会说你遵循“莫斯科时间”,或者也许是“莫斯科标准时间”。 (参见维基百科在Time in Russia上的条目。)
所以这只是一个例子,但问题是从何处获取时区名称?一般问题是它们不在the TZDB data中,因此PHP不会将它们还给您。正如我所说,他们受到解释。时区缩写也需要解释。如果您想要略好的解释,here提供的解释似乎更合理。但它可能仍需要根据您的目的进行过滤。
更好的时区名称来源于Unicode CLDR。它们提供了一个非常大的数据集,可以将许多东西翻译成不同的语言,它们涵盖的内容之一就是时区的名称。但是要从CLDR数据中获取IANA时区密钥的时区名称,您必须跳过很多环节:
在CLDR MetaZones list中查找密钥。
找到您感兴趣的Language File,例如English。
在语言文件中找到元区域,并确定您想要的名称表单。
当然,您必须从XML或JSON数据源以编程方式完成所有这些操作。你必须为你感兴趣的每个时区做这件事。
为什么要去那么麻烦?好吧,如果你有一个会说另一种语言的用户,例如法语,那么你想向他们展示“中欧标准时间”或“欧洲中心标准时间”吗?只有CLDR可以为您提供那种翻译。
所以我知道这并没有直接提供你可以立即使用的PHP代码,但希望你现在明白为什么这不是直接可能的,而且你所遇到的任何列表都取决于某人自己的个人解释,可能会过时或部分不正确。