簡體   English   中英

如何將PHP時區字符串(例如歐洲/柏林)轉換為codeigniter時區(例如UP1)

[英]how to convert PHP timezone string(e.g Europe/Berlin) to codeigniter timezone(e.g. UP1)

簡而言之,如果我不得不問這個問題只是這個鏈接問題的反面問題

我正在使用一個javscript庫,它自動檢測時區並以PHP格式返回時區名稱,即'Europe/Berlin'格式。

但是我使用了Codeigniters timezone_menu ,它提供了一個時間時區的下拉框 ,我想知道如何將這個php時區(即'Europe/Berlin' )轉換為codeigniters時區格式即UP1

CodeIgniter文檔中可以看出,它們將時區視為固定偏移。 他們的慣例非常直截了當:

  • UTC代表完全 UTC。

    要么

  • U表示UTC

  • MP表示減號或加號

  • 用於描述偏移的數字

    • 整個小時偏移的單個數字
    • 當有半小時的偏移時,兩個數字,但這些被轉移時髦(你會認為+05:30將由UP55代表,但它實際上是UP45

那他們為什么要這樣做呢? 誰知道。 它不是標准的東西,它是CodeIgnitor的特殊格式。 通常,偏移量僅表示為+05:30+0530

使用偏移來表示整個時區與現實不同步。 如果這很容易,那么我們首先不需要像Europe/Berlin這樣的IANA時區。 您可以在此處的時區列表中看到Europe/Berlin在+01:00和+02:00之間交替顯示。 Code Ignitor可能會說它是UP1 ,但那時不會考慮日光時間偏移。 (夏令時在全世界都是不同的,所以你不能只用一個復選框來增加它,並期望它是可靠的。)

因此,如果您必須擁有CodeIgnitor奇怪的時區表示形式,那么請采用IANA區域的基本偏移並應用其時髦的公式(如dev-null-dweller 在其答案中所示 )。 只是不要指望它是准確的。

如果你的區域有:45偏移,那么你運氣不好。 這將是Pacific/ChathamAsia/Kathmandu

你可以在“Time Zone!= Offset”下的timezone標簽wiki中閱讀更多內容

只是為了給這個答案添加一些實際上具有建設性的東西,我建議不要使用CodeIgnitor的時區。 只需堅持PHP為您提供的IANA區域即可。 它們甚至通過PECL中的timezondb保持最新。

我不太了解CI,但是從快速查看日期幫助文檔,看起來它可以從offset創建:

$now = new DateTime('now', new DateTimeZone('UTC'));
$tz = new DateTimeZone('America/Argentina/Buenos_Aires');
$offset = $tz->getOffset($now) / 3600;

$ci_tz = 'U';
if($offset) {
    if($offset < 0) {
        $ci_tz .= 'M';
        $offset = abs($offset);
    } else {
        $ci_tz .= 'P';
    }
    if(is_float($offset)) {
        $offset = $offset * 10 - 10;
    }
    $ci_tz .= (string)$offset;
} else {
    $ci_tz .= 'TC';
}
var_dump($ci_tz); // UM3 = UTC Minus 3 hours

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM