IntlDateFormatter::create

datefmt_create

IntlDateFormatter::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::create -- datefmt_create -- IntlDateFormatter::__construct创建日期格式化器

描述

面向对象风格

public static IntlDateFormatter::create(
    ?string $locale,
    int $dateType = IntlDateFormatter::FULL,
    int $timeType = IntlDateFormatter::FULL,
    IntlTimeZone|DateTimeZone|string|null $timezone = null,
    IntlCalendar|int|null $calendar = null,
    ?string $pattern = null
): ?IntlDateFormatter

面向对象风格(构造函数)

public IntlDateFormatter::__construct(
    ?string $locale,
    int $dateType = IntlDateFormatter::FULL,
    int $timeType = IntlDateFormatter::FULL,
    IntlTimeZone|DateTimeZone|string|null $timezone = null,
    IntlCalendar|int|null $calendar = null,
    ?string $pattern = null
)

过程式风格

datefmt_create(
    ?string $locale,
    int $dateType = IntlDateFormatter::FULL,
    int $timeType = IntlDateFormatter::FULL,
    IntlTimeZone|DateTimeZone|string|null $timezone = null,
    IntlCalendar|int|null $calendar = null,
    ?string $pattern = null
): ?IntlDateFormatter

创建日期格式化器。

参数

locale

格式化或解析时要使用的区域设置,或 null 以使用 ini 设置 intl.default_locale 中指定的值。

dateType

IntlDateFormatter 常量 之一确定的日期格式。默认值为 IntlDateFormatter::FULL

timeType

IntlDateFormatter 常量 之一确定的时间格式。默认值为 IntlDateFormatter::FULL

timezone

时区 ID。默认值(如果给出 null 时使用的值)是 date_default_timezone_get() 返回的值,或者(如果适用)是为 calendar 参数传递的 IntlCalendar 对象的时区。此 ID 必须是 ICU 数据库上的有效标识符,或者表示显式偏移量的 ID,例如 GMT-05:30

这也可能是 IntlTimeZoneDateTimeZone 对象。

calendar

用于格式化或解析的日历。默认值为 null,它对应于 IntlDateFormatter::GREGORIAN。这可以是 IntlDateFormatter 日历常量 之一,也可以是 IntlCalendar。传递的任何 IntlCalendar 对象都将被克隆;它不会被 IntlDateFormatter 更改。这将决定使用的日历类型(公历、伊斯兰历、波斯历等),以及如果为 timezone 参数给出 null,还将决定使用的时区。

pattern

格式化或解析时要使用的可选模式。可能的模式记录在 » https://unicode-org.github.io/icu/userguide/format_parse/datetime/ 上。

返回值

创建的 IntlDateFormatter,如果失败则为 null

变更日志

版本 描述
8.1.0

参数 dateTypetimeType 现在是可选的。

示例

示例 #1 datefmt_create() 示例

<?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);
?>

示例 #3 无效区域设置处理的示例

<?php
try {
$fmt = new IntlDateFormatter(
'invalid_locale',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'dunno',
IntlDateFormatter::GREGORIAN,
);
} catch (
\Error $e) {
// ...
}
?>

上面的示例将输出

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

另请参阅

添加注释

用户贡献的注释 5 个注释

daniel dot rhodes at warpasylum dot co dot uk
12 年前
应该注意的是,传递到 IntlDateFormatter 构造函数中的区域设置字符串支持 UCA 关键字。 因此,例如,您可以执行以下操作来将年份输出为日本年号年份

<?php
$now
= new DateTime(); //DateTime 是从版本 5.2.0 开始的核心 PHP 类

$formatter = new IntlDateFormatter('ja_JP', IntlDateFormatter::FULL,
IntlDateFormatter::FULL, 'Asia/Tokyo', IntlDateFormatter::GREGORIAN);

echo
'现在是: "' . $formatter->format($now) . '" in Tokyo' . "\n";
//上面给出 [现在是: "2011年8月19日金曜日 23時32分27秒JST" in Tokyo]

$formatter = new IntlDateFormatter('ja_JP@calendar=japanese', IntlDateFormatter::FULL,
IntlDateFormatter::FULL, 'Asia/Tokyo', IntlDateFormatter::TRADITIONAL);

echo
'现在是: "' . $formatter->format($now) . '" in Tokyo' . "\n";
//上面给出 [现在是: "平成23年8月19日金曜日 23時32分27秒JST" in Tokyo]
?>
mikko dot rantalainen at peda dot net
12 年前
文档中写道“时区:时区 ID,默认值为系统默认值”。

“系统默认值”实际上只表示 Unix/Linux 系统上的“TZ”环境变量。 它不表示 PHP ini 设置或通过 date_default_timezone_set() 设置的值,也不表示文件“/etc/timezone”中的操作系统默认时区。
info at mobger dot de
1 年前
$locale 也可以包含关于日历的信息

<?php
//...
$traditionalFormatter = new IntlDateFormatter(
$locale.'@calendar='.$calendar,
IntlDateFormatter::SHORT,
IntlDateFormatter::SHORT,
'Europe/Berlin',
IntlDateFormatter::TRADITIONAL,
'yyyy/MM/dd HH:mm:ss' // ICU-datetime-format
);
//..
?>

要获取 $calendar 的允许值,请使用以下代码

<?php
$bundle
=new ResourceBundle('','ICUDATA');
$cnames=[];
$calendars=$bundle->get('calendar');
foreach(
$calendars as $n=>$v){
$cnames[]=$n;
}
echo (
print_r($cnames,true));

?>

结果是
数组
(
[0] => buddhist
[1] => chinese
[2] => coptic
[3] => dangi
[4] => default
[5] => ethiopic
[6] => ethiopic-amete-alem
[7] => gregorian
[8] => hebrew
[9] => indian
[10] => islamic
[11] => islamic-civil
[12] => japanese
[13] => persian
[14] => roc
)
匿名
6 年前
文档中说 $datetype 和 $timetype 也可以是 NULL,在这种情况下,将使用 ICU 的默认日期类型或时间类型。

但是,当还设置 declare (strict_types=1); 时,Intl 无法创建 IntlDateFormatter 类,并且返回错误“datefmt_create: unable to parse input parameters”。
Patanjali
3 年前
需要明确的是,要使用任何非公历日历

a. 区域设置必须采用 locale@calendar=calendar-name 的形式

b. 日历必须使用 intlDateFormatter::TRADITIONAL 常量,或使用 locale(如 a 中所述)创建的 intlCalendar 对象。

即使使用 intlDateFormatter::TRADITIONAL 常量,日历名称也可以是“gregorian”,这使得代码方法更加通用。
To Top