cari

Rumah  >  Soal Jawab  >  teks badan

Dalam PHP, IntCalendar mengeluarkan tempat yang salah.

<p>Saya mempunyai kod berikut, yang saya percaya sepatutnya mengeluarkan fr_FR sebagai tempat, tetapi atas sebab tertentu ia mengeluarkan en_US_POSIX (tanpa mengira zon waktu). Apa yang saya buat salah? </p> <pre class="brush:php;toolbar:false;">$loc = IntlCalendar::createInstance(new DateTimeZone('Eropah/Paris')); echo $loc->getLocale(Locale::VALID_LOCALE);</pre> <p>Pautan rujukan: https://www.php.net/manual/en/intlcalendar.createinstance.php dan https://www.php.net/manual/en/intlcalendar.getlocale.php<br /> ;<br />Nampaknya ini bukan pendekatan yang betul (walaupun kod itu sah) - adakah terdapat cara yang lebih sesuai untuk mencari tempat "lalai" untuk zon waktu tertentu? </p><p><br /></p>
P粉553428780P粉553428780536 hari yang lalu628

membalas semua(2)saya akan balas

  • P粉464088437

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

    Anda tetapkan zon waktu anda kepada zon waktu Paris. Tetapi anda tidak menetapkan tempat. Mereka adalah perkara yang berbeza. Tempatan mentakrifkan bahasa dan konvensyen pemformatan, manakala zon waktu menetapkan peraturan untuk menukar UTC kepada waktu tempatan dan kembali lagi. Perkara yang anda takrifkan terpakai kepada rakyat Amerika di Paris. Ini adalah kes penggunaan yang sah, terutamanya pada bulan Ogos!

    Sila cuba kod berikut:


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

    balas
    0
  • P粉054616867

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

    Anda boleh bermula dengan mendapatkan negara yang berkaitan (dan kod negara) dari zon waktu tertentu:

    $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'];
    

    Anda kemudian boleh menggabungkan maklumat ini dengan sumber yang tersedia di perpustakaan ICU untuk mendapatkan bahasa yang paling mungkin untuk kod negara tertentu:

    // 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);
    }
    

    Sila ambil perhatian bahawa ini tidak terpakai kepada setiap pengguna. Ini adalah titik permulaan lalai yang baik, tetapi anda harus sentiasa meminta pengguna untuk pilihan bahasa mereka.

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

    balas
    0
  • Batalbalas