PHPでは、 timezone_identifiers_list()関数を使用して、すべての既知のタイムゾーン識別子のリストを取得します。これは、開発者が時間とタイムゾーン関連の機能を処理するときに使用するのに便利です。この関数は、 「アジア/上海」 、 「ヨーロッパ/ロンドン」などのタイムゾーン名を含む配列を返します。しかし、多くの開発者は、この関数を使用して直接取得したタイムゾーンリストは、夏時間の節約時間(DST)を含むかどうかを明確に区別できないことを発見しました。
この記事では、この問題の根本原因と、夏時間がタイムゾーンでサポートされているかどうかをプログラム的に決定および解決する方法を詳細に説明します。
timezone_identifiers_list()は、タイムゾーンの名前を単純にリストするだけでなく、夏時間の節約時間にタイムゾーンが有効になっているかどうかはわかりません。たとえば、「ヨーロッパ/ロンドン」には夏時間の調整がありますが、「アジア/上海」は夏時間を節約します。この関数を使用するだけで得られたリストを区別することはできません。
これらのタイムゾーン文字列を直接使用して夏時間の判断を下すと、プログラムの時間エラーが夏時間の節約時間、または無効な時間の計算を切り替えることができます。
タイムゾーンが夏時間をサポートするかどうかを判断するには、PHPのDatetimezoneクラスとDateTimeクラスの協力に依存する必要があります。アイデアは次のとおりです。
各タイムゾーン識別子について、時間オブジェクトは2つの時点で生成されます:夏の時間(7月など)と冬の時間(1月など)。
DateTimeZone :: getOffset()メソッドを介して、これら2つの時点でのUTCオフセットが同じかどうかを比較します。
オフセットが異なる場合、タイムゾーンが夏時間をサポートすることを意味します。それ以外の場合はサポートされていません。
以下は、夏時間の節約時間をサポートするタイムゾーンのリストを除外する方法を示すPHPコードの例です。
<?php
$allTimezones = timezone_identifiers_list();
$dstTimezones = [];
foreach ($allTimezones as $timezone) {
$tz = new DateTimeZone($timezone);
// 冬の時間を過ごしてください:1月1日
$winter = new DateTime('2023-01-01', $tz);
// 夏に時間をかけてください:7月1日
$summer = new DateTime('2023-07-01', $tz);
// オフセット秒を取得します
$winterOffset = $tz->getOffset($winter);
$summerOffset = $tz->getOffset($summer);
if ($winterOffset !== $summerOffset) {
// 異なるオフセット,夏の時間があることを示します
$dstTimezones[] = $timezone;
}
}
// 夏時間の節約時間をサポートする出力ゾーン
echo "<pre>";
print_r($dstTimezones);
echo "</pre>";
?>
このコードは、「ヨーロッパ/ロンドン」 、 「アメリカ/new_york」など、夏時間の調整を含むすべてのタイムゾーン識別子を出力します。
timezone_identifiers_list()は、タイムゾーンリストのみを取得でき、夏時間がサポートされているかどうかを区別できません。
同じタイムゾーンの異なる時点でUTCオフセットを比較することにより、夏時間が有効になっているかどうかを正確に判断できます。
タイムゾーンでの時間の計算とプレゼンテーションに関しては、夏時間のサポートの合理的な判断は、時間の混乱の多くの問題を回避することができます。
この記事を通じて、開発者は時間処理ロジックをより正確に制御し、夏時間の節約時にプログラムがまだ正しく実行されるようにすることができます。