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, array|int|string|null $format = null, ?string $locale = null): string|false

过程式风格

datefmt_format_object(IntlCalendar|DateTimeInterface $datetime, array|int|string|null $format = null, ?string $locale = null): string|false

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

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

参数

datetime

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

format

如何格式化日期/时间。这可以是一个包含两个元素的 array(第一个是日期样式,第二个是时间样式,它们都是以下常量之一:IntlDateFormatter::NONE, IntlDateFormatter::SHORT, IntlDateFormatter::MEDIUM, IntlDateFormatter::LONG, IntlDateFormatter::FULL),一个值为这些常量之一的 int(在这种情况下,它将用于时间和日期),或者一个 string,其中包含 » 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
"默认:\n\t",
IntlDateFormatter::formatObject($cal),
"\n";

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

echo
"array \$format (无,完整):\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
"使用 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` 并不比 `format` 慢! (在 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)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
with Xdebug v2.3.2, Copyright (c) 2002-2015, by 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.336579s
`format` : 0.391158s
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)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
with Xdebug v2.3.2, Copyright (c) 2002-2015, by 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