PHP Conference Japan 2024

IntlDateFormatter::formatObject

datefmt_format_object

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL intl >= 3.0.0)

IntlDateFormatter::formatObject -- datefmt_format_object格式化对象

描述

面向对象风格

public static IntlDateFormatter::formatObject(IntlCalendar|DateTimeInterface $datetime, 数组|整数|字符串|空值 $format = null, ?字符串 $locale = null): 字符串|false

过程化风格

datefmt_format_object(IntlCalendar|DateTimeInterface $datetime, 数组|整数|字符串|空值 $format = null, ?字符串 $locale = null): 字符串|false

此函数允许在不首先显式创建 IntlDateFormatter 对象的情况下格式化 IntlCalendarDateTime 对象。

将创建的临时 IntlDateFormatter 将从传入的对象中获取时区。不会使用 PHP 捆绑的时区数据库 – 而将使用 ICU 的时区数据库。因此,在 DateTime 对象中使用的时区标识符也必须存在于 ICU 的数据库中。

参数

datetime

类型为 IntlCalendarDateTime 的对象。将使用对象中的时区信息。

format

如何格式化日期/时间。这可以是一个包含两个元素的 数组(第一个是日期样式,第二个是时间样式,这些样式是以下常量之一:IntlDateFormatter::NONEIntlDateFormatter::SHORTIntlDateFormatter::MEDIUMIntlDateFormatter::LONGIntlDateFormatter::FULL),一个值为其中一个常量的 整数(在这种情况下,它将同时用于时间和日期)或一个 字符串,其格式在 » ICU 文档 中进行了描述。如果为 null,则将使用默认样式。

locale

要使用的区域设置,或 null 以使用 默认区域设置

返回值

包含结果的字符串,或在失败时返回 false

示例

示例 #1 IntlDateFormatter::formatObject() 示例

<?php
/* 默认时区无关紧要;从对象中获取时区 */
ini_set('date.timezone', 'UTC');
/* 从此 ini 设置中获取默认区域设置 */
ini_set('intl.default_locale', 'fr_FR');

$cal = IntlCalendar::fromDateTime("2013-06-06 17:05:06 Europe/Dublin");
echo
"default:\n\t",
IntlDateFormatter::formatObject($cal),
"\n";

echo
"long \$format (full):\n\t",
IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL),
"\n";

echo
"array \$format (none, full):\n\t",
IntlDateFormatter::formatObject($cal, array(
IntlDateFormatter::NONE,
IntlDateFormatter::FULL)),
"\n";

echo
"string \$format (d 'of' MMMM y):\n\t",
IntlDateFormatter::formatObject($cal, "d 'of' MMMM y", 'en_US'),
"\n";

echo
"with DateTime:\n\t",
IntlDateFormatter::formatObject(
new
DateTime("2013-09-09 09:09:09 Europe/Madrid"),
IntlDateFormatter::FULL,
'es_ES'),
"\n";

以上示例将输出

default:
    6 juin 2013 17:05:06
long $format (full):
    jeudi 6 juin 2013 17:05:06 heure d’été irlandaise
array $format (none, full):
    17:05:06 heure d’été irlandaise
string $format (d 'of' MMMM y):
    6 of June 2013
with DateTime:
    lunes, 9 de septiembre de 2013 09:09:09 Hora de verano de Europa central

添加注释

用户贡献的注释 4 条注释

匿名
1 年前
`format` 与静态 `formatObject`

** `formatObject` 并不慢!(在 PHP 5.5 上)**

使用 `format` 方法或静态 `formatObject`。

由于 `formatObject` 正在执行 `new IntlDateFormatter` 的工作并使用提供的模式,因此必须在循环中包含实例化行!

另一个被揭穿的错误的错误测试!

php -v
PHP 5.5.26-1+deb.sury.org~precise+1 (cli) (built: Jun 15 2015 10:04:01)
版权所有 (c) 1997-2015 The PHP Group
Zend 引擎 v2.5.0,版权所有 (c) 1998-2015 Zend Technologies
包含 Zend OPcache v7.0.6-dev,版权所有 (c) 1999-2015,由 Zend Technologies 提供
包含 Xdebug v2.3.2,版权所有 (c) 2002-2015,由 Derick Rethans 提供

<?php
date_default_timezone_set
('America/Los_Angeles');
$n = 3000;

$dt = new DateTime('2015-01-03 12:32:44');

$time[] = microtime(true);
for(
$i=0;$i<$n;$i++) {
$a = IntlDateFormatter::formatObject($dt, 'MMMM dd', 'hu_HU');
}
echo
"$a\n";
$time[] = microtime(true);
for(
$i=0;$i<$n;$i++) {
$df = new IntlDateFormatter('hu_HU', IntlDateFormatter::SHORT, IntlDateFormatter::NONE, null, null, 'MMMM dd');
$a = $df->format($dt);
}
echo
"$a\n";
$time[] = microtime(true);

for(
$j=1;$j<count($time);$j++) {
printf("%fs\n", $time[$j]-$time[$j-1]);
}
?>

`formatObject` : 0.336579 秒
`format` : 0.391158 秒
raf at sns dot pm
2 年前
如果您想根据特定方案和本地语言格式化日期,请访问此链接以获取要使用的格式化代码的参考,我没有在文档中直接找到它
https://unicode-org.github.io/icu/userguide/format_parse/datetime/#date-field-symbol-table
这是一个使用 DateTime 对象的测试

<?php

// 服务器必须要求
date_default_timezone_set( 'Europe/Paris' );

// 实例化一个新的 DateTime 对象
$dateTimeObj = new DateTime('now', new DateTimeZone('Europe/Paris'));

// 使用特定方案格式化日期
// 3 个参数为 [ DateTimeObject,ICU 方案,区域设置代码字符串 ]
$dateFromatted = IntlDateFormatter::formatObject( $dateTimeObj, "eee d MMMM y à HH:mm", 'fr' );

// 测试:
echo ucwords($dateFromatted);
// 输出:Jeu. 7 Avril 2022 à 04:36 // 格式化成我想要的

?>
ferenczi dot krisztian at gmail dot com
9 年前
`format` 与静态 `formatObject`

`formatObject` 比较慢!`format` 快 10-13 倍以上!(在 PHP 5.5 上)使用 `format` 方法而不是静态 `formatObject`。

php -v
PHP 5.5.26-1+deb.sury.org~precise+1 (cli) (built: Jun 15 2015 10:04:01)
版权所有 (c) 1997-2015 The PHP Group
Zend 引擎 v2.5.0,版权所有 (c) 1998-2015 Zend Technologies
包含 Zend OPcache v7.0.6-dev,版权所有 (c) 1999-2015,由 Zend Technologies 提供
包含 Xdebug v2.3.2,版权所有 (c) 2002-2015,由 Derick Rethans 提供

<?php
$n
= 3000;

$dt = new \DateTime('2015-01-03 12:32:44');
$df = new IntlDateFormatter('hu_HU', IntlDateFormatter::SHORT, IntlDateFormatter::NONE);
$df->setPattern('MMMM dd');

$time[] = microtime(true);
for(
$i=0;$i<$n;$i++) {
$a = IntlDateFormatter::formatObject($dt, 'MMMM dd', 'hu_HU');
}
echo
"$a\n";
$time[] = microtime(true);
for(
$i=0;$i<$n;$i++) {
$a = $df->format($dt);
}
echo
"$a\n";
$time[] = microtime(true);

for(
$j=1;$j<count($time);$j++) {
printf("%fs\n", $time[$j]-$time[$j-1]);
}
?>

`formatObject` : 0.458248 秒
`format` : 0.033759 秒
sebastian at huehnerhose dot de
7 年前
它在 php7.1 上仍然比较慢,但没有那么夸张了,我这里大约慢了 5 倍
To Top