基本上我的网站是全球性的,我需要能够检测用户的时区并显示准确的时间。我有这个非常整洁的脚本,直到现在它曾经完美地工作得很好。它需要一个时区偏移量,我用javascript获取并通过cookie传递。
if(!empty($_COOKIE['tz']) && $_COOKIE['tz']>=-12 && $_COOKIE['tz']<=13){
$offset = $_COOKIE['tz'];
$tz = timezone_name_from_abbr(null, $offset * 3600, true);
if($tz === false) $tz = timezone_name_from_abbr(null, $offset * 3600, false);
date_default_timezone_set($tz);
}else{
date_default_timezone_set('UTC');
}
问题是目前我正在测试的时区是欧洲/赫尔辛基,即 UTC+2(没有夏令时),但由于某种原因,timezone_name_from_abbr()
决定 2*3600 是欧洲/巴黎。我对日期和时间区真的很糟糕,我迫切需要帮助,拜托!
一般来说,仅基于偏移量(如 UTC+02:00)定位确切时区(如 Europe/Helsinki
或 Europe/Paris
)的想法是不可能的,具有任何可靠性或准确性。 许多时区在任何给定时间点共享相同的偏移量,并且由于夏令时规则,许多时区在一年中的两个不同偏移量之间切换。
您可以在此处查看所有时区及其标准和日光偏移量的列表。
甚至从时区缩写到时区的想法也不合理,因为多个时区可以共享相同的缩写。 例如,"CST"可以是"中部标准时间"(美国)、"中部标准时间"(澳大利亚)、"中部夏令时"(澳大利亚)、"中国标准时间"或"古巴标准时间"。 有关详细信息,请参阅此列表。
鉴于这些问题,PHP 会给你一个叫做 timezone_name_from_abbr
的函数是相当奇怪的。 我建议避免使用它,因为它在概念上显然存在缺陷。
如果您正在检测用户的时区,请考虑使用 JavaScript 库 jsTimeZoneDetect。 它也不是完美的,但它通常可以工作,并且基于更合乎逻辑的算法。