您应该知道,PHP 的 IntlDateFormatter 类使用 ISO 日期格式代码而不是 PHP 的 date() 格式代码。在我看来,这一点并没有真正清楚地说明。
可以在 http://framework.zend.com/manual/1.12/en/zend.date.constants.html#zend.date.constants.selfdefinedformats 找到 ISO 代码的良好列表,并且也应该在此处添加此类列表。
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)
IntlDateFormatter::format -- datefmt_format — 将日期/时间值格式化为字符串
面向对象风格
过程化风格
$formatter
, IntlCalendar|DateTimeInterface|数组|字符串|整数|浮点数 $datetime
): 字符串|false将时间值格式化为字符串。
formatter
日期格式化程序资源。
datetime
要格式化的值。这可以是 DateTimeInterface 对象、IntlCalendar 对象、表示自纪元以来的(可能为小数)秒数的 数值 类型,或由 localtime() 输出的 数组 格式。
如果传递了 DateTime 或 IntlCalendar 对象,则不会考虑其时区。该对象将使用格式化程序配置的时区进行格式化。如果要使用要格式化对象的时区,则必须先使用该对象的时区调用 IntlDateFormatter::setTimeZone()。或者,可以使用静态函数 IntlDateFormatter::formatObject()。
格式化的字符串,如果发生错误,则为 false
。
版本 | 描述 |
---|---|
7.1.5 | 添加了对向 datetime 参数提供通用 DateTimeInterface 对象的支持。以前,只支持正确的 DateTime 对象。 |
PECL intl 3.0.0 | 添加了对向 datetime 参数提供 IntlCalendar 对象的支持。 |
示例 #1 datefmt_format() 示例
<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo '第一个格式化输出是 ' . datefmt_format($fmt, 0);
$fmt = datefmt_create(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo '第二个格式化输出是 ' . datefmt_format($fmt, 0);
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo '使用模式的第一个格式化输出是 ' . datefmt_format($fmt, 0);
$fmt = datefmt_create(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo "使用模式的第二个格式化输出是 " . datefmt_format($fmt, 0);
?>
示例 #2 OO 示例
<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo '第一个格式化输出为 ' . $fmt->format(0);
$fmt = new IntlDateFormatter(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo '第二个格式化输出为 ' . $fmt->format(0);
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo '使用模式的第一个格式化输出为 ' . $fmt->format(0);
$fmt = new IntlDateFormatter(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo '使用模式的第二个格式化输出为 ' . $fmt->format(0);
?>
以上示例将输出
First Formatted output is Wednesday, December 31, 1969 4:00:00 PM PT Second Formatted output is Mittwoch, 31. Dezember 1969 16:00 Uhr GMT-08:00 First Formatted output with pattern is 12/31/1969 Second Formatted output with pattern is 12/31/1969
示例 #3 使用 IntlCalendar 对象
<?php
$tz = reset(iterator_to_array(IntlTimeZone::createEnumeration('FR')));
$formatter = IntlDateFormatter::create(
'fr_FR',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
$tz,
IntlDateFormatter::GREGORIAN
);
$cal = IntlCalendar::createInstance($tz, '@calendar=islamic-civil');
$cal->set(IntlCalendar::FIELD_MONTH, 8); //第 9 个月,斋月
$cal->set(IntlCalendar::FIELD_DAY_OF_MONTH, 1); //第一天
$cal->clear(IntlCalendar::FIELD_HOUR_OF_DAY);
$cal->clear(IntlCalendar::FIELD_MINUTE);
$cal->clear(IntlCalendar::FIELD_SECOND);
$cal->clear(IntlCalendar::FIELD_MILLISECOND);
echo "在这一伊斯兰教历年,斋月开始/将开始于:\n\t",
$formatter->format($cal), "\n";
//使用的是格式化程序的时区:
$formatter->setTimeZone('Asia/Tokyo');
echo "更改时区后:\n\t",
$formatter->format($cal), "\n";
以上示例将输出
In this islamic year, Ramadan started/will start on: mardi 9 juillet 2013 19:00:00 heure avancée d’Europe centrale After changing timezone: mercredi 10 juillet 2013 02:00:00 heure normale du Japon
您应该知道,PHP 的 IntlDateFormatter 类使用 ISO 日期格式代码而不是 PHP 的 date() 格式代码。在我看来,这一点并没有真正清楚地说明。
可以在 http://framework.zend.com/manual/1.12/en/zend.date.constants.html#zend.date.constants.selfdefinedformats 找到 ISO 代码的良好列表,并且也应该在此处添加此类列表。
我希望这能为将来不得不应对开发和生产平台上不同 PHP 版本的其他人节省一些时间
当使用 *自定义模式* 格式化 DateTime 对象时,请确保使用时间戳传递给 IntlDateFormatter::format,以便使其在不同的 PHP 版本上都能正常工作
PHP 版本 5.3.5-1ubuntu7.2(我的开发机器)的示例
<?php
$date = new \DateTime();
$dateFormatter = \IntlDateFormatter::create(
\Locale::getDefault(),
\IntlDateFormatter::NONE,
\IntlDateFormatter::NONE,
\date_default_timezone_get(),
\IntlDateFormatter::GREGORIAN,
'EEEE'
);
var_dump($dateFormatter->format($date)); // string(6) "Monday"
?>
PHP 版本 5.3.2-1ubuntu4.9(生产服务器)的示例
<?php
// 与上面相同的格式
var_dump($dateFormatter->format($date)); // bool(false)
?>
当使用 $dateFormatter->format($date->getTimestamp()) 时,您将始终获得格式化和本地化的字符串,而不是 false。