0

我已经将 Intl 安装到我的服务器上。

我已将我的更改default_timezone为欧洲/伊斯坦布尔和intl.default_localetr_TR。

我仍然得到英文的日期名称。

我错过了什么?

我应该更改一些其他设置吗?

4

3 回答 3

4

我建议使用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 变得混乱setlocaleLocale::setDefault。这使您可以以非常结构化的方式轻松地输出/格式化不同的语言环境。它还推动了 PHP5 的新 OOPness 的使用——不再是date废话,您现在应该使用DateTime

IntlDateFormatter 构造函数有一个相当长的签名,如下所示:

  1. $locale- 一个规范化的语言环境,您可以通过过滤您选择的语言环境来确保获得正确的语言环境Locale::canonicalize
  2. $dateType- 我将其设置为 'none' (int -1) 并使用格式参数 ( $pattern) 以获得最大的灵活性。也接受“short”、“medium”、“long”和“full”。您可以在ICU 项目文档中了解更多关于它们的信息。
  3. $timeType- 相同$dateType但处理时间。
  4. $timezone- 这不是的实例DateTimeZone,而是字符串时区。PHP 的Date类与 intl 的类不兼容(例外是某些内置适配器,例如IntlDateFormatter::format方法)。
  5. $calendar- 通常是公历 ( null),但也可以接受 的实例IntlCalendar
  6. $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();
}
于 2014-06-25T15:23:13.320 回答
1
      <?php
        setlocale(LC_ALL, 'tr_TR.UTF-8');
        echo strftime("%e %B %Y %A", time());
      ?>

打印出来:30 Ekim 2015 Cuma

代码工作正常。

于 2015-10-30T21:04:55.283 回答
0
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
} 
于 2018-08-07T08:02:28.313 回答