我已经将 Intl 安装到我的服务器上。
我已将我的更改default_timezone
为欧洲/伊斯坦布尔和intl.default_locale
tr_TR。
我仍然得到英文的日期名称。
我错过了什么?
我应该更改一些其他设置吗?
我建议使用IntlDateFormatter
. 这在 PHP 的intl
模块中是可用的,从这个问题的标题来看,这个扩展是可用的。
示例/粗略实现:
$locale = 'tr_TR'; // a canonicalized locale
$format = 'MMM e'; // ISO format codes, not the typical date ones
$dt = new DateTime(); // a DateTime object
$df = new IntlDateFormatter(
$locale, // string locale
IntlDateFormatter::NONE, // int date type
IntlDateFormatter::NONE, // int time type
'UTC', // string timezone
IntlDateFormatter::GREGORIAN, // int cal type
$format // string pattern
);
var_dump($dt->format('c')); // string '2014-06-25T08:22:48-07:00' (length=25)
var_dump($df->format($dt)); // string 'Haz 3' (length=5)
首先,使用任何 Intl* 类都是有益的,因为您不需要使用 或 不断重置 PHP 的运行时语言环境(这可能会使 IMO 变得混乱setlocale
)Locale::setDefault
。这使您可以以非常结构化的方式轻松地输出/格式化不同的语言环境。它还推动了 PHP5 的新 OOPness 的使用——不再是date
废话,您现在应该使用DateTime
。
IntlDateFormatter 构造函数有一个相当长的签名,如下所示:
$locale
- 一个规范化的语言环境,您可以通过过滤您选择的语言环境来确保获得正确的语言环境Locale::canonicalize
。$dateType
- 我将其设置为 'none' (int -1
) 并使用格式参数 ( $pattern
) 以获得最大的灵活性。也接受“short”、“medium”、“long”和“full”。您可以在ICU 项目文档中了解更多关于它们的信息。$timeType
- 相同$dateType
但处理时间。$timezone
- 这不是的实例DateTimeZone
,而是字符串时区。PHP 的Date
类与 intl 的类不兼容(例外是某些内置适配器,例如IntlDateFormatter::format
方法)。$calendar
- 通常是公历 ( null
),但也可以接受 的实例IntlCalendar
。$pattern
- 要使用的解析/渲染格式,将其视为等效于date
的第一个参数。但是,它们并不相同:ICU(此类使用的底层库)采用了一种 ISO 格式,该格式在Zend Framework 文档中有详细记录。例如,不要使用'Y'
4 位数年份,而是使用'yyyy'
. ISO 格式比 PHP 的要健壮得多。一旦有了 的实例和IntlDateFormatter
对象DateTime
,就可以将两者粘合在一起,以使用IntlDateFormatter::format
. 该format
方法接受一个参数:一个实例DateTime
——小菜一碟!
$instanceOfIntlDateFormatter->format($instanceOfDateTime);
作为奖励,该format
方法可以采用多种对象(类型mixed
),引用:
要格式化的值。这可能是一个
DateTime
对象、一个IntlCalendar
对象、一个表示自纪元以来的(可能是小数)秒数的数字类型或格式为localtime()
.
关于时区参数的说明:DateTime
在 PHP 5.5.0 版本中更改。我已经使用以下作为解决方法(不记得细节,自己解决)......
$timezoneForIntl = $instanceOfDateTime->getTimezone();
if ( version_compare(PHP_VERSION,'5.5.0','<') ) {
$timezoneForIntl = $timezoneForIntl->getName();
}
<?php
setlocale(LC_ALL, 'tr_TR.UTF-8');
echo strftime("%e %B %Y %A", time());
?>
打印出来:30 Ekim 2015 Cuma
代码工作正常。
public function getTurkishDate(){
$locale = 'tr_TR'; // a canonicalized locale
$format = 'dd-MMMM-YYYY'; // ISO format codes, not the typical date ones
$dt = new DateTime(); // a DateTime object
$df = new IntlDateFormatter(
$locale, // string locale
IntlDateFormatter::NONE, // int date type
IntlDateFormatter::NONE, // int time type
'UTC', // string timezone
IntlDateFormatter::GREGORIAN, // int cal type
$format // string pattern
);
return $df->format($dt); //string 07-Ağustos-2018
}