PHPでは、組み込み関数TimeZone_Identifiers_Listを介してすべての有効なTimeZone識別子を取得できます。この関数は、すべてのタイムゾーン識別子を含む配列を返します。次に、 DateTimeZoneクラスを使用して、各タイムゾーンのUTCオフセットを計算できます。この記事では、これらの機能を介してすべてのゾーンのUTCオフセットを取得して表示する方法を詳細に説明します。
まず、すべての有効なタイムゾーン識別子を取得する必要があります。 timezone_identifiers_list()関数を使用して実装できます。この関数はパラメーターを受け入れず、すべてのタイムゾーン識別子を含む配列を返します。タイムゾーン識別子を取得するためのコードは次のとおりです。
<span><span><span class="hljs-variable">$timezones</span></span><span> = </span><span><span class="hljs-title function_ invoke__">timezone_identifiers_list</span></span><span>();
</span></span>
タイムゾーンリストを取得した後、これらのタイムゾーン識別子を反復し、各タイムゾーンのUTCオフセットを計算する必要があります。これを行うには、 DateTimeZoneクラスを使用してタイムゾーンオブジェクトを作成し、 getOffset()メソッドを使用してオフセットを取得できます。 getOffset()メソッドは、秒単位でオフセットを返します。
<span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$timezones</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$timezone</span></span><span>) {
</span><span><span class="hljs-comment">// タイムゾーンオブジェクトを作成します</span></span><span>
</span><span><span class="hljs-variable">$tz</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DateTimeZone</span></span><span>(</span><span><span class="hljs-variable">$timezone</span></span><span>);
</span><span><span class="hljs-comment">// 現在の時間を取得します UTC オフセット(ユニット:2番)</span></span><span>
</span><span><span class="hljs-variable">$offset</span></span><span> = </span><span><span class="hljs-variable">$tz</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getOffset</span></span><span>(</span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DateTime</span></span><span>(</span><span><span class="hljs-string">"now"</span></span><span>, </span><span><span class="hljs-variable">$tz</span></span><span>));
</span><span><span class="hljs-comment">// 将オフセット转换为小时和分钟的格式</span></span><span>
</span><span><span class="hljs-variable">$offset_hours</span></span><span> = </span><span><span class="hljs-title function_ invoke__">intdiv</span></span><span>(</span><span><span class="hljs-variable">$offset</span></span><span>, </span><span><span class="hljs-number">3600</span></span><span>); </span><span><span class="hljs-comment">// 時間を計算します</span></span><span>
</span><span><span class="hljs-variable">$offset_minutes</span></span><span> = </span><span><span class="hljs-title function_ invoke__">abs</span></span><span>((</span><span><span class="hljs-variable">$offset</span></span><span> % </span><span><span class="hljs-number">3600</span></span><span>) / </span><span><span class="hljs-number">60</span></span><span>); </span><span><span class="hljs-comment">// 分数を計算します</span></span><span>
</span><span><span class="hljs-comment">// 输出时区和オフセット</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$timezone</span></span><span> . </span><span><span class="hljs-string">' UTC '</span></span><span> . (</span><span><span class="hljs-variable">$offset_hours</span></span><span> >= </span><span><span class="hljs-number">0</span></span><span> ? </span><span><span class="hljs-string">'+'</span></span><span> : </span><span><span class="hljs-string">'-'</span></span><span>) . </span><span><span class="hljs-title function_ invoke__">abs</span></span><span>(</span><span><span class="hljs-variable">$offset_hours</span></span><span>) . </span><span><span class="hljs-string">':'</span></span><span> . </span><span><span class="hljs-title function_ invoke__">str_pad</span></span><span>(</span><span><span class="hljs-variable">$offset_minutes</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'0'</span></span><span>, STR_PAD_LEFT) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>
上記のコードでは、 getOffset()を介してUTCオフセットの秒数を取得します。よりフレンドリーなオフセットを表示するには、それらを時間と微小の形式に変換する必要があります。オフセットのユニットは秒です。 3600で割ると、時間数を取得できます。次に、残りを取ることで、分数を計算できます。最後に、タイムゾーンと対応するオフセットを出力します。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// すべてのタイムゾーン識別子を取得します</span></span><span>
</span><span><span class="hljs-variable">$timezones</span></span><span> = </span><span><span class="hljs-title function_ invoke__">timezone_identifiers_list</span></span><span>();
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$timezones</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$timezone</span></span><span>) {
</span><span><span class="hljs-comment">// タイムゾーンオブジェクトを作成します</span></span><span>
</span><span><span class="hljs-variable">$tz</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DateTimeZone</span></span><span>(</span><span><span class="hljs-variable">$timezone</span></span><span>);
</span><span><span class="hljs-comment">// 現在の時間を取得します UTC オフセット(ユニット:2番)</span></span><span>
</span><span><span class="hljs-variable">$offset</span></span><span> = </span><span><span class="hljs-variable">$tz</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getOffset</span></span><span>(</span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DateTime</span></span><span>(</span><span><span class="hljs-string">"now"</span></span><span>, </span><span><span class="hljs-variable">$tz</span></span><span>));
</span><span><span class="hljs-comment">// 将オフセット转换为小时和分钟的格式</span></span><span>
</span><span><span class="hljs-variable">$offset_hours</span></span><span> = </span><span><span class="hljs-title function_ invoke__">intdiv</span></span><span>(</span><span><span class="hljs-variable">$offset</span></span><span>, </span><span><span class="hljs-number">3600</span></span><span>); </span><span><span class="hljs-comment">// 時間を計算します</span></span><span>
</span><span><span class="hljs-variable">$offset_minutes</span></span><span> = </span><span><span class="hljs-title function_ invoke__">abs</span></span><span>((</span><span><span class="hljs-variable">$offset</span></span><span> % </span><span><span class="hljs-number">3600</span></span><span>) / </span><span><span class="hljs-number">60</span></span><span>); </span><span><span class="hljs-comment">// 分数を計算します</span></span><span>
</span><span><span class="hljs-comment">// 输出时区和オフセット</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$timezone</span></span><span> . </span><span><span class="hljs-string">' UTC '</span></span><span> . (</span><span><span class="hljs-variable">$offset_hours</span></span><span> >= </span><span><span class="hljs-number">0</span></span><span> ? </span><span><span class="hljs-string">'+'</span></span><span> : </span><span><span class="hljs-string">'-'</span></span><span>) . </span><span><span class="hljs-title function_ invoke__">abs</span></span><span>(</span><span><span class="hljs-variable">$offset_hours</span></span><span>) . </span><span><span class="hljs-string">':'</span></span><span> . </span><span><span class="hljs-title function_ invoke__">str_pad</span></span><span>(</span><span><span class="hljs-variable">$offset_minutes</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'0'</span></span><span>, STR_PAD_LEFT) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
上記のコードを実行すると、次の出力が表示されます。
<span><span>Africa/Abidjan UTC +0:00
Africa/Accra UTC +0:00
Africa/Addis_Ababa UTC +3:00
Africa/Algiers UTC +1:00
Africa/Asmara UTC +3:00
</span><span><span class="hljs-meta prompt_">...</span></span><span>
Asia/Kolkata UTC +5:30
Asia/Kuala_Lumpur UTC +8:00
Asia/Kuwait UTC +3:00
</span><span><span class="hljs-meta prompt_">...</span></span><span>
</span></span>
各行には、タイムゾーンと対応するUTCオフセットが表示され、各タイムゾーン間の時間の違いを表示できます。
夏時間を検討してください。特定の日付でタイムゾーンのオフセットを取得する場合は、新しいDateTime( "Now"、$ TZ)を使用する代わりに、 DateTimeオブジェクトの特定の時間を指定できます。これにより、夏時間(DST)の影響を考慮することができます。
日付と時刻の処理: getOffset()メソッドは、UTC時間に対するオフセットを返します。一般的に、時間の違いを判断するのに非常に役立ちますが、日付と時刻の変換が関係する場合は、 DateTimeオブジェクトでさらに行う必要がある場合があります。
出力形式:この例の出力形式は、日付やタイムゾーンの詳細を追加するなど、必要に応じてカスタマイズできる「UTC +/-時間:分」形式です。
PHPのTimeZone_Identifiers_List関数とDateTimeZoneクラスを使用すると、すべてのタイムゾーンのUTCオフセットを簡単に取得できます。この機能は、時間の違いの正確な計算を必要とするタイムゾーンとプロジェクトを越えたアプリケーションで非常に実用的です。この記事の詳細な操作ガイドが、タイムゾーンのUTCオフセットを取得および表示する方法をよりよく理解するのに役立つことを願っています。