【问题标题】:How to display date names (day, month) in Turkish - Php5, Apache2, Intl如何在土耳其语中显示日期名称(日、月) - Php5、Apache2、Intl
【发布时间】:2014-08-16 05:20:24
【问题描述】:

我已经在我的服务器上安装了 Intl。

我已将 default_timezone 更改为 Europe/Istanbul,将 intl.default_locale 更改为 tr_TR。

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

我错过了什么?

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

【问题讨论】:

  • 如果在脚本顶部添加setlocale(LC_TIME, 'tr_TR'); 会发生什么?
  • @trizz 没什么变化...我不想使用 strftime 函数。使用新的日期时间和格式来显示我的日期。
  • setlocale 更改整个脚本和所有时间/日期函数的区域设置,而不仅仅是strftime。您可以检查区域设置 tr_TR 是否安装在您的服务器上,并在您的 SSH shell 中使用 locale -a。如果未安装,它将回退到英语。
  • 是的。我可以在列表中看到 tr_TR 和 tr_TR.utf8...

标签: php apache intl


【解决方案1】:

我建议使用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* 类都是有益的,因为您不需要使用 setlocaleLocale::setDefault 不断重置 PHP 的运行时语言环境(这可能会导致 IMO 混乱)。这使您可以以非常结构化的方式轻松地输出/格式化不同的语言环境。它还推动使用 PHP5 的新 OOPness —— 不再是 date 废话,您现在应该使用 DateTime

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

  1. $locale - 一个规范化的语言环境,您可以通过 Locale::canonicalize 过滤您选择的语言环境来确保您获得了正确的语言环境。
  2. $dateType - 我将其设置为“无”(int -1)并使用格式参数($pattern)以获得最大的灵活性。也接受“short”、“medium”、“long”和“full”。您可以在ICU project docs 中阅读有关它们的更多信息。
  3. $timeType - 与 $dateType 相同,但处理的是时间。
  4. $timezone - 这不是DateTimeZone 的一个实例,而是一个字符串时区。 PHP 的 Date 类与 intl 的类不兼容(某些内置适配器例外,例如 IntlDateFormatter::format 方法)。
  5. $calendar - 通常是公历 (null),但也可以接受 IntlCalendar 的实例。
  6. $pattern - 要使用的解析/渲染格式,将其视为等同于 date 的第一个参数。但是,它们不一样:ICU(该类使用的底层库)采用了在 Zend Framework docs 中有详细记录的 ISO 格式。例如,您可以使用'yyyy',而不是使用'Y' 来表示4 位数的年份。 ISO 格式比 PHP 的更强大。

一旦您拥有IntlDateFormatter 的实例以及DateTime 对象,您可以将两者粘合在一起,以在给定的语言环境中以给定的格式呈现包含您想要的日期/时间的字符串(如之前定义的)使用IntlDateFormatter::formatformat 方法接受一个参数: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 书的一章 :) 干得好,谢谢。
【解决方案2】:
      <?php
        setlocale(LC_ALL, 'tr_TR.UTF-8');
        echo strftime("%e %B %Y %A", time());
      ?>

打印出来:30 Ekim 2015 Cuma

代码运行良好。

【讨论】:

    【解决方案3】:
    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
    } 
    

    【讨论】:

    • 欢迎来到 SO 并感谢您直接潜入回答问题。为了对以后遇到您的答案的人提供最大的帮助,添加一些解释而不仅仅是代码是很有用的。见How to Answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    相关资源
    最近更新 更多