DateTime::createFromFormat
date_create_from_format
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
DateTime::createFromFormat -- date_create_from_format — 根據給定的格式解析日期時間字串
說明
物件導向風格
$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
S
2 個字母表示的一個月中的第幾天(序數詞), 在進行解析的時候會被忽略 st
,nd
,rd
或者th
。z
一年中的第幾天,從 0 開始 0
到365
月 --- --- F
和M
文字表示的月份,例如 January 或者 Sept January
到December
或者Jan
到Dec
m
和n
數值表示的月份,有前導 0 或者無前導 0 01
到12
or1
到12
年 --- --- Y
4 位數字表示的年 例如: 1999
或2003
y
2 位數字表示的年, 可用的範圍是 1970 至 2069(不含) 例如: 99
或03
(表示1999
和2003
)時間 --- --- a
和A
上午、下午 am
或pm
g
andh
12 小時制的小時,有前導 0 或者無前導 0 1
到12
或者01
到12
G
和H
24 小時制的小時,有前導 0 或者無前導 0 0
到23
或00
到23
i
分鐘,有前導 0 00
到59
s
秒,有前導 0 00
到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
參見
- DateTime::__construct() - 返回一個新的 DateTime 對像
- DateTime::getLastErrors() - 獲取警告和錯誤資訊
- checkdate() - 驗證一個格里高里日期
- strptime() - 解析由 strftime 產生的日期/時間