1

基本的に、私の Web サイトは世界規模であり、ユーザーのタイム ゾーンを検出して正確な時刻を表示できる必要があります。私はこれまで完璧にうまく機能していたこの本当にきちんとしたスクリプトを持っています。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 がヨーロッパ/パリであると判断することです。日付とタイムゾーンがとても苦手です。どうしても助けが必要です。

4

1 に答える 1

5

一般に、オフセット (UTC+02:00 など) のみに基づいて正確なタイム ゾーン ( や など) を特定するという考えはEurope/Helsinki、信頼性や正確性を問わず不可能です。Europe/Paris多くのタイム ゾーンは、任意の時点で同じオフセットを共有しており、多くのタイム ゾーンは、夏時間の規則により、年間を通じて 2 つの異なるオフセットの間で切り替わります。

すべてのタイム ゾーンのリストと、それらの標準および夏時間のオフセットをここで確認できます。

複数のタイムゾーンが同じ略語を共有する可能性があるため、タイムゾーンの略語からタイムゾーンに移行するという考えでさえ健全ではありません。たとえば、「CST」は、「中央標準時」(米国)、「中央標準時」(オーストラリア)、「中央夏時間」(オーストラリア)、「中国標準時」、「キューバ標準時」のいずれかです。詳しくはこちらの一覧をご覧ください。

これらの懸念を考えると、PHP が という関数を提供するのはかなり奇妙ですtimezone_name_from_abbr。明らかに概念的に欠陥があるため、使用しないことをお勧めします。

ユーザーのタイムゾーンを検出したい場合は、JavaScript ライブラリjsTimeZoneDetectの使用を検討してください。これも完全ではありませんが、一般的に機能し、より論理的なアルゴリズムに基づいています。

于 2013-10-27T22:19:51.363 に答える