根據給定的格式解析日期時間字串

DateTime::createFromFormat

date_create_from_format

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

DateTime::createFromFormat -- date_create_from_format — 根據給定的格式解析日期時間字串

說明

物件導向風格

public static DateTime::createFromFormat(string $format, string $time, DateTimeZone $timezone = ?): DateTime

過程化風格

date_create_from_format(string $format, string $time, DateTimeZone $timezone = ?): DateTime

將 time 參數給定的日期時間字串, 根據 format 參數給定的格式 解析為一個新的 DateTime 對象。

參數

format

在解析日期時間字串的時候使用的格式 string。 參加下列的格式清單。 大部分格式和 date() 函式中的格式是一致的。

format 參數中支援的字元
format 中的字元解釋示例
日------
d 和 j一個月中的第幾天,2 位數字表示,有前導 0 或者無前導 0 01 到 31 或者 1 到 31
D 和 l星期幾的文字表示 Mon 到 Sun 或者 Sunday 到 Saturday
S2 個字母表示的一個月中的第幾天(序數詞), 在進行解析的時候會被忽略 st,nd,rd 或者 th。
z一年中的第幾天,從 0 開始0 到 365
月------
F 和 M文字表示的月份,例如 January 或者 Sept January 到 December 或者 Jan 到 Dec
m 和 n數值表示的月份,有前導 0 或者無前導 0 01 到 12 or 1 到 12
年------
Y4 位數字表示的年例如:1999 或 2003
y 2 位數字表示的年, 可用的範圍是 1970 至 2069(不含) 例如: 99 或 03 (表示 1999 和 2003)
時間------
a 和 A上午、下午am 或 pm
g and h12 小時制的小時,有前導 0 或者無前導 0 1 到 12 或者 01 到 12
G 和 H24 小時制的小時,有前導 0 或者無前導 0 0 到 23 或 00 到 23
i分鐘,有前導 000 到 59
s秒,有前導 000 到 59
u微秒,最多到 6 位數字示例:45,654321
時區------
e,O, P 和 T時區名稱,或者是以 UTC 時區為基準的小時偏移量, 或者是以 UTC 為基準的小時和分鐘的偏移量, 小時和分鐘之間用冒號(:)分隔。示例:UTC,GMT, Atlantic/Azores 或 +0200 或 +02:00 或 EST,MDT
完整的日期和時間------
U從 Unix Epoch (January 1 1970 00:00:00 GMT) 開始計算的時間,以秒為單位示例:1292177455
空白字元和分隔字元------
(空格)一個空格字元或者一個 tab 字元示例:
# 可以是一下分隔符號中的任意一個: ;, :,/,., ,,-,( 或 )示例:/
;, :,/,., ,,-,( 或 )特殊字元示例:-
?隨機位元組示例:^ (需要注意的是, 對於 UTF-8 字元,可能會需要多個 ?。 這種情況下,請使用 *)
*隨機位元組,直到遇到下一個有效的分隔符號或者數值示例:使用 Y-*-d 格式用來解析 2009-aWord-08 字串的時候, * 會匹配 aWord
! 將所有的欄位(年、月、日、時、分、秒、微秒以及時區)重置到 Unix Epoch 時間。如果不使用 !, 格式, 那麼所有的欄位會被設定為系統目前的日期和時間。
|將尚未被解析的欄位,也即格式字串中未明確指定的欄位 (年、月、日、時、分、秒、微秒以及時區) 重置到 Unix Epoch 時間。Y-m-d| 會解析日期時間字串中的年、月和日, 但是對於時、分、秒欄位會設定為 0.
+在格式字串中使用這個格式表示字元, 並且所提供的日期時間字串中包含除了格式字元之外的其他數據的話,不會發出一個錯誤,而是發出一個警告。使用 DateTime::getLastErrors() 方法 來檢測所給定的日期時間字串中是否包含格式字串指定的內容之外的數據。

如果在格式字串中包含不可識別的字元, 那麼會導致解析失敗,並且在返回的結構中附加一個錯誤資訊。 可以通過 DateTime::getLastErrors() 來探查解析是否存在錯誤。

如果需要在格式字串 format 參數中使用 上述表示格式的字元作為一個普通字元,請對其使用反斜線(\)進行轉義。

如果格式字串參數 format 中不包含 ! 字元, 那麼沒有在 format 參數中指明的欄位, 在解析結果中將會被設定為系統目前時間對應的欄位值。

如果格式字串參數 format 包含了 ! 字元, 那麼沒有在 format 參數中指明的欄位, 以及在 ! 左側對應的欄位, 在解析結果中將會被設定為 Unix epoch 時間對應的欄位。

The Unix epoch 為 1970-01-01 00:00:00 UTC。

time

用來表示日期時間的字串。

timezone

DateTimeZone 對象, 表示在解析日期時間字串的時候需要使用的時區。

如果忽略 timezone 參數, 並且表示日期時間的字串 time 中也不包含時區資訊, 那麼將會使用系統目前時區作為解析結果對象的時區。

注意:

如果 time 參數 是 UNIX 時間戳格式(例如:946684800), 或者其中已經包含了時區資訊(例如:2010-01-28T15:00:00+02:00), 那麼 timezone 以及系統目前時區 都將會被忽略。

返回值

返回一個 DateTime 對象。 或者在失敗時返回 false。

更新日誌

版本說明
5.3.9 新增 format 格式字串中對於 + 格式字元的支援。

範例

示例 #1 DateTime::createFromFormat() 例程

物件導向風格

<?php
$date 
= DateTime::createFromFormat('j-M-Y', '15-Feb-2009');
echo 
$date->format('Y-m-d');
?>

過程化風格

<?php
$date 
= date_create_from_format('j-M-Y', '15-Feb-2009');
echo 
date_format($date, 'Y-m-d');
?>

以上例程會輸出:

2009-02-15

示例 #2 DateTime::createFromFormat() 的複雜用法

<?php
echo 'Current time: ' . date('Y-m-d H:i:s') . "\n";

$format = 'Y-m-d';
$date = DateTime::createFromFormat($format, '2009-02-15');
echo 
"Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";

$format = 'Y-m-d H:i:s';
$date = DateTime::createFromFormat($format, '2009-02-15 15:16:17');
echo 
"Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";

$format = 'Y-m-!d H:i:s';
$date = DateTime::createFromFormat($format, '2009-02-15 15:16:17');
echo 
"Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";

$format = '!d';
$date = DateTime::createFromFormat($format, '15');
echo 
"Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";
?>

以上例程的輸出類似於:

Current time: 2010-04-23 10:29:35
Format: Y-m-d; 2009-02-15 10:29:35
Format: Y-m-d H:i:s; 2009-02-15 15:16:17
Format: Y-m-!d H:i:s; 1970-01-15 15:16:17
Format: !d; 1970-01-15 00:00:00

示例 #3 格式化字串中包含了需要進行轉義的字元

<?php
echo DateTime::createFromFormat('H\h i\m s\s','23h 15m 03s')->format('H:i:s');
?>

以上例程的輸出類似於:

23:15:03

參見

Leave a Reply

Your email address will not be published. Required fields are marked *