在PHP 中,我們可以通過內置的函數timezone_identifiers_list獲取所有有效的時區標識符。這個函數返回一個包含所有時區標識符的數組。接下來,我們可以利用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 偏移量(單位:秒)</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 偏移量(單位:秒)</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對象指定具體的時間,而不是使用new DateTime("now", $tz) 。這樣,您可以考慮夏令時(DST)的影響。
日期和時間的處理: getOffset()方法返回的是相對於UTC 時間的偏移量。通常,它對於判斷時間差異非常有用,但如果涉及到日期和時間轉換,您可能需要使用DateTime對象進行更多操作。
輸出格式:本示例的輸出格式是“UTC +/- 時:分” 格式,您可以根據需要進行自定義修改,如添加日期或時區的詳細信息。
通過PHP 的timezone_identifiers_list函數與DateTimeZone類,我們可以輕鬆獲取所有時區的UTC 偏移量。這個功能在跨時區應用和需要準確計算時間差的項目中非常實用。希望本文的詳細操作指南能夠幫助您更好地理解如何獲取並顯示時區的UTC 偏移量。