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

代表日期/時間的字串。

返回值

返回包含給定日期/時間詳細資訊的關聯式陣列。

返回的陣列包含 year(年)、month(月)、day(日)、hour(時)、minute(分)、second(秒)、fraction(小數部分)和 is_localtime(是否為本地時間)的鍵值。

如果存在 is_localtime,則 zone_type 表示時區類型。對於類型 1(UTC 偏移量),會添加 zoneis_dst 欄位;對於類型 2(縮寫),會添加 tz_abbris_dst 欄位;對於類型 3(時區識別碼),會添加 tz_abbrtz_id 欄位。

該陣列包含 warning_count(警告計數)和 warnings(警告)欄位。前者表示警告的數量。 warnings 陣列元素的鍵值表示警告在給定 datetime 中發生的位置,字串值則描述警告本身。以下範例顯示了這樣的警告。

該陣列還包含 error_count(錯誤計數)和 errors(錯誤)欄位。前者表示找到的錯誤數量。 errors 陣列元素的鍵值表示錯誤在給定 datetime 中發生的位置,字串值則描述錯誤本身。以下範例顯示了這樣的錯誤。

警告

如果警告或錯誤發生在相同的位置,則 warningserrors 陣列中的陣列元素數量可能會少於 warning_counterror_count

錯誤/例外

datetime 包含空位元組 (NULL-bytes) 時,此函式會拋出 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 則註記

jp dot amarok at email dot cz
1 個月前
檢查錯誤最安全的方法似乎不是檢查錯誤的數量,而是檢查警告的數量。請參考以下範例,其中「m」和「d」被交換,因此不正確。

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

輸出:
陣列(
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"]=>
陣列(
1) {
[
10]=>
string(27) "The parsed date was invalid"
}
[
"error_count"]=>
int(0)
[
"errors"]=>
陣列(
0) {
}
[
"is_localtime"]=>
bool(false)
}
?>

這個函式會直接將 18 指派給「month」欄位,而不會產生錯誤!!因此,只需使用 if 條件式並檢查「warning_count」即可偵測可能的錯誤。
To Top