좋아, 나 자신도이에 대한 호기심, 그래서 테스트를 고안했다.
는 우선이 두 파일
setlocale()
테스트 :
<?php
# locale1.php
error_reporting(E_ALL | E_STRICT);
date_default_timezone_set('Europe/Amsterdam');
setlocale(LC_ALL, 'dutch_nld'); // awkward Windows locale string
sleep(10); // let's sleep for a bit here
echo strftime('%A, %B %d, %Y %X %Z', time());
및
<?php
# locale2.php
error_reporting(E_ALL | E_STRICT);
date_default_timezone_set('America/Los_Angeles');
setlocale(LC_ALL, 'english_usa'); // awkward Windows locale string
echo strftime('%A, %B %d, %Y %X %Z', time());
그런 다음 나는 두 개의 별도 탭에서 그들을 실행. 처음으로
locale1.php
은 로케일 설정 후 10 초 동안 잠자기 상태가되어 그 사이에
locale2.php
을 실행할 시간을줍니다. 놀랍게도
locale2.php
으로
조차 제대로 로케일을 변경할 수 없습니다.
sleep(10)
이
locale1.php
인데 반하여 Apache/PHP 프로세스를 도용하여
locale2.php
이 로케일을 변경하지 못하도록합니다. 그러나
은입니다. 그러나 당연히 데일리언은 원하는대로 현지화되지 않았습니다.
편집 : 죄송합니다. 그런 다음 locale2.php
않습니다 변화 로케일과 locale1.php
나타납니다 자고 후 네덜란드어 대신에 영어 날짜를 인쇄합니다. 따라서 은이 예상되는 동작 인 setlocale()
과 일치하는 것으로 보입니다. 에서와 같이 동일한 방식으로
<?php
# locale1.php
error_reporting(E_ALL | E_STRICT);
$dateFormatter = new IntlDateFormatter(
'nl_NL',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'Europe/Amsterdam'
);
sleep(10); // let's sleep for a bit here
echo $dateFormatter->format(time());
및
<?php
# locale2.php
error_reporting(E_ALL | E_STRICT);
$dateFormatter = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles'
);
echo $dateFormatter->format(time());
을 다음 두 개의 별도의 탭에서 다시 실행 : /편집
는 다음, 나는이 두 파일 IntlDateFormatter
테스트 첫 번째 파일 세트. 이 은이 예상 한 결과를 제공합니다. locale1.php
이 자고있는 동안 locale2.php
은 미국 규칙에 따라 미국 영어로 날짜를 멋지게 인쇄합니다. 그 후 locale1.php
은 네덜란드어 규칙에 따라 네덜란드어로 날짜를 멋지게 인쇄합니다.
그래서, 결론,
Intl
그
setlocale
문제에서 안전 나타납니다.
물론 마음도 Hyunmin Kim's 대답. 나는 Intl
을 사용하는 경험이 부족하기 때문에 이에 대해 언급 할 수 없었다. 나는 최근에만 Intl
을 발견했습니다.
재미있는 테스트 - 아직 로케일을 실험하지는 않았으므로 이것은 새로운 영역입니다. 'setlocale'과'Intl' 접근 방식의 차이점은 무엇입니까? – RS7
글쎄요, 한 가지로,'Intl'은이 점에서 더 안전하고 신뢰할 수있는 것 같습니다. 당신이 언급 한'setlocale'의 스레드 문제는 정확히 내가 드러낸 바로이 문제입니다. 좋은 다른 지역화 된 날짜를 인쇄하려고 할 때 다른 스레드 (다른 PHP 스크립트를 의미)가 로케일을 변경하지 않는다는 것을 결코 확신 할 수 없습니다 (또는'setlocale'에 의존하는 다른 것). –