搜尋

首頁  >  問答  >  主體

在PHP中,IntCalendar輸出錯誤的區域設定。

<p>我有以下程式碼,我相信它應該輸出 fr_FR 作為區域設置,但出於某種原因它輸出 en_US_POSIX(無論時區如何)。我做錯了什麼? </p> <pre class="brush:php;toolbar:false;">$loc = IntlCalendar::createInstance(new DateTimeZone('Europe/Paris')); echo $loc->getLocale(Locale::VALID_LOCALE);</pre> <p>參考連結:https://www.php.net/manual/en/intlcalendar.createinstance.php 與https://www.php.net/manual/en/intlcalendar.getlocale.php<br /> ;<br />看起來這不是正確的方法(儘管代碼是有效的)- 是否有更適合的方法來找到給定時區的“預設”區域設定? </p><p><br /></p>
P粉553428780P粉553428780490 天前578

全部回覆(2)我來回復

  • P粉464088437

    P粉4640884372023-07-29 09:18:13

    您將時區設定為巴黎的時區。但您沒有設定區域設定。它們是不同的東西。區域設定定義了語言和格式約定,而時區則設定了將 UTC 轉換為本地時間和再次轉換回去的規則。您定義的內容適用於在巴黎的美國人。這是一個有效的用例,尤其是在八月!

    請嘗試以下程式碼:


    #
    $loc = IntlCalendar::createInstance( new DateTimeZone( 'Europe/Paris' ), 'fr_FR' );
    echo $loc->getLocale( Locale::VALID_LOCALE ); 

    回覆
    0
  • P粉054616867

    P粉0546168672023-07-29 09:01:21

    您可以從給定時區取得關聯的國家(以及國家代碼)開始:

    $userTimezone = new DateTimeZone('Europe/Paris');
    
    $location = $userTimezone->getLocation();
    /*
    array(4) {
      ["country_code"]=>  string(2) "FR"
      ["latitude"]=>  float(48.866659999999996)
      ["longitude"]=>  float(2.3333299999999895)
      ["comments"]=>  string(0) ""
    }
    */
    
    $countryCode = $location['country_code'];
    

    然後,您可以將該資訊與 ICU 庫中可用的資源結合起來,以獲取給定國家代碼的最可能語言:

    // From @ausi's answer in https://stackoverflow.com/a/58512299/1456201
    function getLanguage(string $country): string {
        $subtags = \ResourceBundle::create('likelySubtags', 'ICUDATA', false);
        $country = \Locale::canonicalize('und_'.$country);
        $locale = $subtags->get($country) ?: $subtags->get('und');
        return \Locale::getPrimaryLanguage($locale);
    }
    

    請注意,這並不適用於每個使用者。這是一個不錯的預設起點,但您應該始終詢問使用者的語言偏好。

    $possibleLocale = getLanguage($countryCode) . '_' . $countryCode; // fr_FR 

    回覆
    0
  • 取消回覆