PHP Conference Japan 2024

date_parse_from_format

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

date_parse_from_format根据指定的格式获取关于给定日期的详细信息

描述

date_parse_from_format(字符串 $format, 字符串 $datetime): 数组

返回包含给定日期/时间的详细信息的关联数组。

参数

format

关于如何使用format的文档,请参考DateTimeImmutable::createFromFormat()的文档。相同的规则适用。

datetime

表示日期/时间的字符串。

返回值

返回包含给定日期/时间的详细信息的关联数组。

返回的数组包含yearmonthdayhourminutesecondfractionis_localtime的键。

如果存在is_localtime,则zone_type指示时区的类型。对于类型1(UTC偏移量),会添加zoneis_dst字段;对于类型2(缩写),会添加tz_abbris_dst字段;对于类型3(时区标识符),会添加tz_abbrtz_id字段。

数组包含warning_countwarnings字段。前者表示有多少个警告。 warnings数组的元素键表示警告发生在给定datetime中的位置,字符串值描述警告本身。下面的示例显示了这样的警告。

数组还包含error_counterrors字段。前者表示发现了多少个错误。errors数组的元素键表示错误发生在给定datetime中的位置,字符串值描述错误本身。下面的示例显示了这样的错误。

警告

warningserrors数组中的数组元素数量可能小于warning_counterror_count,如果它们发生在同一位置。

错误/异常

datetime包含空字节时,此函数会抛出ValueError

变更日志

版本 描述
8.0.21, 8.1.8, 8.2.0 现在当空字节传递到datetime时会抛出ValueError,之前是静默忽略的。
7.2.0 返回数组的zone元素现在表示秒而不是分钟,其符号已反转。例如-120现在是7200

示例

示例 #1 date_parse_from_format() 示例

<?php
$date
= "6.1.2009 13:00+01:00";
print_r(date_parse_from_format("j.n.Y H:iP", $date));
?>

以上示例将输出

Array
(
    [year] => 2009
    [month] => 1
    [day] => 6
    [hour] => 13
    [minute] => 0
    [second] => 0
    [fraction] =>
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 1
    [zone_type] => 1
    [zone] => 3600
    [is_dst] =>
)

示例 #2 带警告的date_parse_from_format()示例

<?php
$date
= "26 August 2022 22:30 pm";
$parsed = date_parse_from_format("j F Y G:i a", $date);

echo
"警告数量: ", $parsed['warning_count'], "\n";
foreach (
$parsed['warnings'] as $position => $message) {
echo
"\t在位置 {$position}: {$message}\n";
}
?>

以上示例将输出

Warnings count: 1
	On position 23: The parsed time was invalid

示例 #3 带错误的date_parse_from_format()示例

<?php
$date
= "26 August 2022 CEST";
$parsed = date_parse_from_format("j F Y H:i", $date);

echo
"错误数量: ", $parsed['error_count'], "\n";
foreach (
$parsed['errors'] as $position => $message) {
echo
"\t在位置 {$position}: {$message}\n";
}
?>

以上示例将输出

Errors count: 3
	On position 15: A two digit hour could not be found
	On position 19: Data missing

参见

添加注释

用户贡献注释 1 条注释

0
jp dot amarok at email dot cz
一个月前
似乎检查错误最安全的方法不是检查错误数量,而是警告。请看下面的例子,其中“m”和“d”被交换,因此不正确。

<?php
var_dump
(date_parse_from_format('m.d.Y', '18.10.2024') );

输出:
array(
12) {
[
"year"]=>
int(2024)
[
"month"]=>
int(18)
[
"day"]=>
int(10)
[
"hour"]=>
bool(false)
[
"minute"]=>
bool(false)
[
"second"]=>
bool(false)
[
"fraction"]=>
bool(false)
[
"warning_count"]=>
int(1)
[
"warnings"]=>
array(
1) {
[
10]=>
string(27) "The parsed date was invalid"
}
[
"error_count"]=>
int(0)
[
"errors"]=>
array(
0) {
}
[
"is_localtime"]=>
bool(false)
}
?>

该函数简单地将18赋值给“month”字段,且没有错误!因此,只需使用if条件并检查“warning_count”即可检测可能的错误。
To Top