Как я могу получить список поддерживаемых календарей, часовых поясов, локалей в PHP ICU (intlDateFormatter)?
Получить список календарей, часовых поясов, локалей в PHP ICU (intlDateFormatter)
- Вы пробовали что-то? Пожалуйста, покажите нам некоторые части вашего кода. Спасибо 12.09.2015
- @arman1991, я просто хочу получить список этих элементов, чтобы добавить функции локализации в мое веб-приложение, чтобы каждый пользователь мог видеть даты и время в своем предпочтительном календаре, языке и часовом поясе. Другими словами, я ищу функции, которые возвращают список календарей, таких как григорианский, персидский, иврит, буддийский, исламский и т. д., которые поддерживаются текущей установкой PHP ICU, а также функции для часовых поясов и локалей. 12.09.2015
Ответы:
Как использовать модуль PHP intl для создания массивов локалей, календарей и часовых поясов
Чтобы создать пакет ресурсов для всех локалей:
$bundle=new ResourceBundle('','ICUDATA');
Чтобы перечислить имена ресурсов в комплекте:
$rnames=[];
foreach($bundle as $n=>$v){$rnames[]=$n;}
который производит:
AuxExemplarCharacters
Ellipsis
ExemplarCharacters
ExemplarCharactersNumbers
ExemplarCharactersPunctuation
MoreInformation
NumberElements
Version
calendar
characterLabel
delimiters
fields
layout
listPattern
measurementSystemNames
parse
Чтобы получить массив всех локалей:
$locales=$bundle->getLocales('');
который производит:
af
af_NA
af_ZA
agq
agq_CM
ak
ak_GH
...
gv_IM
ha
ha_GH
ha_NE
ha_NG
haw
...
zh_Hant
zh_Hant_HK
zh_Hant_MO
zh_Hant_TW
zu
zu_ZA
Чтобы получить массив всех имен календарей:
$cnames=[];
$calendars=$bundle->get('calendar');
foreach($calendars as $n=>$v){$cnames[]=$n;}
который производит:
buddhist
chinese
coptic
dangi
default
ethiopic
ethiopic-amete-alem
generic
gregorian
hebrew
indian
islamic
islamic-civil
islamic-rgsa
islamic-tbla
islamic-umalqura
japanese
persian
roc
Чтобы получить список календарей для определенной локали, создайте пакет, например:
$bundle=new ResourceBundle('en','ICUDATA');
Чтобы перечислить все часовые пояса:
// CREATE TIMEZONE ITERATOR AND SET TO START
$zones=[];
$zone_iter=IntlTimeZone::createEnumeration(NULL);
$zone_iter->rewind();
// WHILE VALID TIMEZONE
while($zone_iter->valid()){
// ADD TIMEZONE TO ARRAY
$zones[]=$zone_iter->current();
// NEXT TIMEZONE
$zone_iter->next();
}
производить:
ACT
AET
AGT
ART
AST
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
...
Atlantic/South_Georgia
Atlantic/St_Helena
Atlantic/Stanley
Australia/ACT
Australia/Adelaide
Australia/Brisbane
...
US/Pacific
US/Pacific-New
US/Samoa
UTC
Universal
VST
W-SU
WET
Zulu
Чтобы получить список часовых поясов, которые не устарели, и начать со знакомых регионов, таких как «Азия», выполните цикл:
// WHILE VALID TIMEZONE
while($zone_iter->valid()){
// IF NOT DEPRECATED AND STARTS WITH FAMILIAR REGION NAME
$zone=$zone_iter->current();
$tzone=intltz_create_time_zone($zone);
$czone=$tzone->getCanonicalID($zone);
if(($z==$cid)&&
(preg_match('~^(Af|Am|An|As|At|Au|Eu|In|Pa|Etc/UTC)~',$z)===1)){
// ADD TIMEZONE TO ARRAY
$zones[]=$zone;
}
// NEXT TIMEZONE
$zone_iter->next();
}
производить:
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
...
Australia/Perth
Australia/Sydney
Etc/UTC
Europe/Amsterdam
Europe/Andorra
...
Pacific/Truk
Pacific/Wake
Pacific/Wallis
Обратите внимание, что оно включает каноническое имя для UTC
как Etc/UTC
.
Чтобы перечислить часовые пояса для конкретной страны, создайте итератор, например:
$zone_iter=IntlTimeZone::createEnumeration('AU');
Список часовых поясов:
$all_time_zones = DateTimeZone::listIdentifiers(DateTimeZone::ALL); // 425 zones
См. также связанный вопрос, например. Создание раскрывающегося списка часовых поясов с помощью PHP.
Календарь — вы имеете в виду форматирование даты в зависимости от типа календаря и часового пояса — см. https://www.php.net/manual/en/intldateformatter.create.php и https://www.php.net/manual/en/intldateformatter.format.php:
// basic example
$formatter = IntlDateFormatter::create('en_US', IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'Europe/Prague', IntlDateFormatter::GREGORIAN);
$calendar = IntlCalendar::createInstance('Europe/Prague');
$now_en = $formatter->format($calendar); // "Monday, August 26, 2019 at 12:01:47 PM Central European Summer Time"
// localized with date pattern
$formatter = IntlDateFormatter::create('cs_CS', IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'Europe/Prague', IntlDateFormatter::GREGORIAN, 'dd.MM.yyyy, eeee, H:mm');
$calendar = IntlCalendar::createInstance('Europe/Prague');
$now_cs = $formatter->format($calendar); // "26.08.2019, pondělí, 14:30"
ICU (ver. 64.1) дамп свойств (600+): https://intl.rmcreative.ru/tables?locale=en
Форматы даты ICU: http://userguide.icu-project.org/formatparse/datetime