2024 年日本 PHP 研討會

date_parse

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

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

說明

date_parse(字串 $datetime): 陣列

date_parse() 會根據與 strtotime()DateTimeImmutable::__construct() 相同的規則剖析給定的 datetime 字串。它不會傳回 Unix 時間戳記(使用 strtotime())或 DateTimeImmutable 物件(使用 DateTimeImmutable::__construct()),而是傳回一個關聯式陣列,其中包含它在給定 datetime 字串中偵測到的資訊。

如果找不到特定元素群組的資訊,這些陣列元素將會被設為 false 或遺漏。如果需要從相同的 datetime 字串建構時間戳記或 DateTimeImmutable 物件,可以將更多欄位設為非 false 的值。相關案例請參見範例。

參數

datetime

DateTimeImmutable::__construct() 所接受格式的日期/時間。

回傳值

返回包含已解析日期/時間資訊的 陣列

返回的陣列包含 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 欄位。

如果 datetime 字串中存在相對時間元素,例如 +3 days,則返回的陣列會包含一個鍵值為 relative 的巢狀陣列。這個陣列包含鍵值 yearmonthdayhourminutesecond,以及根據傳入的字串,可能包含 weekdayweekdays

該陣列包含 warning_countwarnings 欄位。前者表示警告的數量。 warnings 陣列元素的鍵值表示警告在給定 datetime 中發生的位置,字串值則描述警告本身。

該陣列還包含 error_counterrors 欄位。前者表示錯誤的數量。 errors 陣列元素的鍵值表示錯誤在給定 datetime 中發生的位置,字串值則描述錯誤本身。

警告

如果警告或錯誤發生在相同位置,warningserrors 陣列中的陣列元素數量可能會少於 warning_counterror_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)
  }
}

另請參閱

  • date_parse_from_format() - 根據指定格式取得給定日期的資訊 用於以特定給定格式解析 datetime
  • checkdate() - 驗證格里高利日期 用於格里高利日期驗證
  • getdate() - 取得日期/時間資訊

新增註記

使用者提供的註記

此頁面沒有使用者提供的註記。
To Top