PHP Conference Japan 2024

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

错误/异常

如果 locale 无效,则会抛出 ValueError

变更日志

版本 描述
8.4.0 如果 locale 无效,则会抛出 ValueError
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 面向对象示例

<?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
13 年前
需要注意的是,传递给 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) . '" 在东京' . "\n";
//上面给出了 [现在是: "2011年8月19日星期五 23时32分27秒JST" 在东京]

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

echo
'现在是: "' . $formatter->format($now) . '" 在东京' . "\n";
//上面给出了 [现在是: "平成23年8月19日星期五 23时32分27秒JST" 在东京]
?>
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日期时间格式
);
//..
?>

要获取 $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 的默认日期类型或时间类型。

但是,当也设置了 (strict_types=1); 时,Intl 无法创建 IntlDateFormatter 类,并返回错误“datefmt_create: unable to parse input parameters”。
Patanjali
3年前
明确一点,要使用任何非格里高利历

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

b. 日历必须使用 intlDateFormatter::TRADITIONAL 常量,或使用在 a 中指定的区域设置创建的 intlCalendar 对象。

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