我建议使用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* 类都是有益的,因为您不需要使用 setlocale 或 Locale::setDefault 不断重置 PHP 的运行时语言环境(这可能会导致 IMO 混乱)。这使您可以以非常结构化的方式轻松地输出/格式化不同的语言环境。它还推动使用 PHP5 的新 OOPness —— 不再是 date 废话,您现在应该使用 DateTime。
IntlDateFormatter 构造函数有一个相当长的签名,如下:
-
$locale - 一个规范化的语言环境,您可以通过 Locale::canonicalize 过滤您选择的语言环境来确保您获得了正确的语言环境。
-
$dateType - 我将其设置为“无”(int -1)并使用格式参数($pattern)以获得最大的灵活性。也接受“short”、“medium”、“long”和“full”。您可以在ICU project docs 中阅读有关它们的更多信息。
-
$timeType - 与 $dateType 相同,但处理的是时间。
-
$timezone - 这不是DateTimeZone 的一个实例,而是一个字符串时区。 PHP 的 Date 类与 intl 的类不兼容(某些内置适配器例外,例如 IntlDateFormatter::format 方法)。
-
$calendar - 通常是公历 (null),但也可以接受 IntlCalendar 的实例。
-
$pattern - 要使用的解析/渲染格式,将其视为等同于 date 的第一个参数。但是,它们不一样:ICU(该类使用的底层库)采用了在 Zend Framework docs 中有详细记录的 ISO 格式。例如,您可以使用'yyyy',而不是使用'Y' 来表示4 位数的年份。 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();
}