(PHP 5 >= 5.2.0, PHP 7, PHP 8)
date_parse — 傳回包含給定日期/時間詳細資訊的關聯式陣列
date_parse() 會根據與 strtotime() 和 DateTimeImmutable::__construct() 相同的規則剖析給定的 datetime
字串。它不會傳回 Unix 時間戳記(使用 strtotime())或 DateTimeImmutable 物件(使用 DateTimeImmutable::__construct()),而是傳回一個關聯式陣列,其中包含它在給定 datetime
字串中偵測到的資訊。
如果找不到特定元素群組的資訊,這些陣列元素將會被設為 false
或遺漏。如果需要從相同的 datetime
字串建構時間戳記或 DateTimeImmutable 物件,可以將更多欄位設為非 false
的值。相關案例請參見範例。
返回包含已解析日期/時間資訊的 陣列。
返回的陣列包含 year
(年)、month
(月)、day
(日)、hour
(時)、minute
(分)、second
(秒)、fraction
(小數)和 is_localtime
(是否為當地時間)的鍵值。
如果存在 is_localtime
,則 zone_type
表示時區類型。對於類型 1
(UTC 位移),會加入 zone
、is_dst
欄位;對於類型 2
(縮寫),會加入 tz_abbr
、is_dst
欄位;對於類型 3
(時區識別碼),會加入 tz_abbr
、tz_id
欄位。
如果 datetime
字串中存在相對時間元素,例如 +3 days
,則返回的陣列會包含一個鍵值為 relative
的巢狀陣列。這個陣列包含鍵值 year
、month
、day
、hour
、minute
、second
,以及根據傳入的字串,可能包含 weekday
和 weekdays
。
該陣列包含 warning_count
和 warnings
欄位。前者表示警告的數量。 warnings
陣列元素的鍵值表示警告在給定 datetime
中發生的位置,字串值則描述警告本身。
該陣列還包含 error_count
和 errors
欄位。前者表示錯誤的數量。 errors
陣列元素的鍵值表示錯誤在給定 datetime
中發生的位置,字串值則描述錯誤本身。
如果警告或錯誤發生在相同位置,warnings
和 errors
陣列中的陣列元素數量可能會少於 warning_count
或 error_count
。
如果日期/時間格式有錯誤,元素 'errors' 將包含錯誤訊息。
版本 | 說明 |
---|---|
7.2.0 | 返回陣列的 zone 元素現在以秒為單位而不是分鐘,並且其符號已反轉。例如,-120 現在是 7200 。 |
範例 #1 使用完整 datetime
字串的 date_parse() 範例
<?php
var_dump(date_parse("2006-12-12 10:00:00.5"));
?>
以上範例將輸出
array(12) { ["year"]=> int(2006) ["month"]=> int(12) ["day"]=> int(12) ["hour"]=> int(10) ["minute"]=> int(0) ["second"]=> int(0) ["fraction"]=> float(0.5) ["warning_count"]=> int(0) ["warnings"]=> array(0) { } ["error_count"]=> int(0) ["errors"]=> array(0) { } ["is_localtime"]=> bool(false) }
時區元素僅在包含於給定的 datetime
字串中時才會顯示。在這種情況下,始終會有一個 zone_type
元素,以及其他幾個取決於其值的元素。
範例 #2 使用時區縮寫資訊的 date_parse()
<?php
var_dump(date_parse("June 2nd, 2022, 10:28:17 BST"));
?>
以上範例將輸出
array(16) { ["year"]=> int(2022) ["month"]=> int(6) ["day"]=> int(2) ["hour"]=> int(10) ["minute"]=> int(28) ["second"]=> int(17) ["fraction"]=> float(0) ["warning_count"]=> int(0) ["warnings"]=> array(0) { } ["error_count"]=> int(0) ["errors"]=> array(0) { } ["is_localtime"]=> bool(true) ["zone_type"]=> int(2) ["zone"]=> int(0) ["is_dst"]=> bool(true) ["tz_abbr"]=> string(3) "BST" }
範例 #3 使用時區識別碼資訊的 date_parse()
<?php
var_dump(date_parse("June 2nd, 2022, 10:28:17 Europe/London"));
?>
以上範例將輸出
array(14) { ["year"]=> int(2022) ["month"]=> int(6) ["day"]=> int(2) ["hour"]=> int(10) ["minute"]=> int(28) ["second"]=> int(17) ["fraction"]=> float(0) ["warning_count"]=> int(0) ["warnings"]=> array(0) { } ["error_count"]=> int(0) ["errors"]=> array(0) { } ["is_localtime"]=> bool(true) ["zone_type"]=> int(3) ["tz_id"]=> string(13) "Europe/London" }
如果解析一個更精簡的 datetime
字串,則可用的資訊較少。在此範例中,所有時間部分都以 false
返回。
範例 #4 使用精簡字串的 date_parse()
<?php
var_dump(date_parse("June 2nd, 2022"));
?>
以上範例將輸出
array(12) { ["year"]=> int(2022) ["month"]=> int(6) ["day"]=> int(2) ["hour"]=> bool(false) ["minute"]=> bool(false) ["second"]=> bool(false) ["fraction"]=> bool(false) ["warning_count"]=> int(0) ["warnings"]=> array(0) { } ["error_count"]=> int(0) ["errors"]=> array(0) { } ["is_localtime"]=> bool(false) }
相對格式 不會影響從絕對格式解析的值,但會解析到「relative」元素中。
範例 #5 使用相對格式的 date_parse()
<?php
var_dump(date_parse("2006-12-12 10:00:00.5 +1 week +1 hour"));
?>
以上範例將輸出
array(13) { ["year"]=> int(2006) ["month"]=> int(12) ["day"]=> int(12) ["hour"]=> int(10) ["minute"]=> int(0) ["second"]=> int(0) ["fraction"]=> float(0.5) ["warning_count"]=> int(0) ["warnings"]=> array(0) { } ["error_count"]=> int(0) ["errors"]=> array(0) { } ["is_localtime"]=> bool(false) ["relative"]=> array(6) { ["year"]=> int(0) ["month"]=> int(0) ["day"]=> int(7) ["hour"]=> int(1) ["minute"]=> int(0) ["second"]=> int(0) } }
某些語句,例如 Thursday
會將字串的時間部分設為 0
。如果將 Thursday
傳遞給 DateTimeImmutable::__construct(),也會導致小時、分鐘、秒和微秒部分設為 0
。然而,在以下範例中,年份元素仍為 false
。
範例 #6 具有副作用的 date_parse()
<?php
var_dump(date_parse("Thursday, June 2nd"));
?>
以上範例將輸出
array(13) { ["year"]=> bool(false) ["month"]=> int(6) ["day"]=> int(2) ["hour"]=> int(0) ["minute"]=> int(0) ["second"]=> int(0) ["fraction"]=> float(0) ["warning_count"]=> int(0) ["warnings"]=> array(0) { } ["error_count"]=> int(0) ["errors"]=> array(0) { } ["is_localtime"]=> bool(false) ["relative"]=> array(7) { ["year"]=> int(0) ["month"]=> int(0) ["day"]=> int(0) ["hour"]=> int(0) ["minute"]=> int(0) ["second"]=> int(0) ["weekday"]=> int(4) } }
datetime