(PHP 5 >= 5.3.0, PHP 7, PHP 8)
DateTime::createFromFormat -- date_create_from_format — 根據(jù)給定的格式解析日期時(shí)間字符串
面向?qū)ο箫L(fēng)格
$format
, string $time
, DateTimeZone $timezone
= ?): DateTime過程化風(fēng)格
將 time
參數(shù)給定的日期時(shí)間字符串,
根據(jù) format
參數(shù)給定的格式
解析為一個(gè)新的 DateTime 對(duì)象。
format
在解析日期時(shí)間字符串的時(shí)候使用的格式 string。 參加下列的格式清單。 大部分格式和 date() 函數(shù)中的格式是一致的。
format 中的字符 |
解釋 | 示例 |
---|---|---|
日 | --- | --- |
d 和 j |
一個(gè)月中的第幾天,2 位數(shù)字表示,有前導(dǎo) 0 或者無前導(dǎo) 0 |
01 到 31 或者
1 到 31
|
D 和 l |
星期幾的文字表示 |
Mon 到 Sun 或者
Sunday 到 Saturday
|
S |
2 個(gè)字母表示的一個(gè)月中的第幾天(序數(shù)詞), 在進(jìn)行解析的時(shí)候會(huì)被忽略 |
st ,nd ,rd 或者
th 。
|
z |
一年中的第幾天,從 0 開始 | 0 到 365 |
月 | --- | --- |
F 和 M |
文本表示的月份,例如 January 或者 Sept |
January 到 December 或者
Jan 到 Dec
|
m 和 n |
數(shù)值表示的月份,有前導(dǎo) 0 或者無前導(dǎo) 0 |
01 到 12 or
1 到 12
|
年 | --- | --- |
Y |
4 位數(shù)字表示的年 | 例如:1999 或 2003 |
y |
2 位數(shù)字表示的年, 可用的范圍是 1970 至 2069(不含) |
例如:
99 或 03
(表示 1999 和
2003 )
|
時(shí)間 | --- | --- |
a 和 A |
上午、下午 | am 或 pm |
g and h |
12 小時(shí)制的小時(shí),有前導(dǎo) 0 或者無前導(dǎo) 0 |
1 到 12 或者
01 到 12
|
G 和 H |
24 小時(shí)制的小時(shí),有前導(dǎo) 0 或者無前導(dǎo) 0 |
0 到 23 或
00 到 23
|
i |
分鐘,有前導(dǎo) 0 | 00 到 59 |
s |
秒,有前導(dǎo) 0 | 00 到 59 |
u |
微秒,最多到 6 位數(shù)字 | 示例:45 ,654321 |
時(shí)區(qū) | --- | --- |
e ,O ,
P 和 T
|
時(shí)區(qū)名稱,或者是以 UTC 時(shí)區(qū)為基準(zhǔn)的小時(shí)偏移量, 或者是以 UTC 為基準(zhǔn)的小時(shí)和分鐘的偏移量, 小時(shí)和分鐘之間用冒號(hào)(:)分隔。 | 示例:UTC ,GMT ,
Atlantic/Azores 或
+0200 或 +02:00 或
EST ,MDT
|
完整的日期和時(shí)間 | --- | --- |
U |
從 Unix Epoch (January 1 1970 00:00:00 GMT) 開始計(jì)算的時(shí)間,以秒為單位 | 示例:1292177455 |
空白字符和分隔字符 | --- | --- |
(空格) |
一個(gè)空格字符或者一個(gè) tab 字符 | 示例: |
# |
可以是一下分隔符號(hào)中的任意一個(gè): ; ,
: ,/ ,. ,
, ,- ,( 或
)
|
示例:/ |
; ,
: ,/ ,. ,
, ,- ,( 或
)
|
特殊字符 | 示例:- |
? |
隨機(jī)字節(jié) | 示例:^ (需要注意的是,
對(duì)于 UTF-8 字符,可能會(huì)需要多個(gè) ? 。
這種情況下,請(qǐng)使用 * )
|
* |
隨機(jī)字節(jié),直到遇到下一個(gè)有效的分隔符號(hào)或者數(shù)值 | 示例:使用 Y-*-d 格式用來解析 2009-aWord-08 字符串的時(shí)候,
* 會(huì)匹配
aWord |
! |
將所有的字段(年、月、日、時(shí)、分、秒、微秒以及時(shí)區(qū))重置到 Unix Epoch 時(shí)間。 | 如果不使用 !, 格式,
那么所有的字段會(huì)被設(shè)置為系統(tǒng)當(dāng)前的日期和時(shí)間。 |
| |
將尚未被解析的字段,也即格式字符串中未明確指定的字段 (年、月、日、時(shí)、分、秒、微秒以及時(shí)區(qū)) 重置到 Unix Epoch 時(shí)間。 | Y-m-d|
會(huì)解析日期時(shí)間字符串中的年、月和日,
但是對(duì)于時(shí)、分、秒字段會(huì)設(shè)置為 0. |
+ |
在格式字符串中使用這個(gè)格式表示字符, 并且所提供的日期時(shí)間字符串中包含除了格式字符之外的其他數(shù)據(jù)的話,不會(huì)發(fā)出一個(gè)錯(cuò)誤,而是發(fā)出一個(gè)警告。 | 使用 DateTime::getLastErrors() 方法 來檢測所給定的日期時(shí)間字符串中是否包含格式字符串指定的內(nèi)容之外的數(shù)據(jù)。 |
如果在格式字符串中包含不可識(shí)別的字符, 那么會(huì)導(dǎo)致解析失敗,并且在返回的結(jié)構(gòu)中附加一個(gè)錯(cuò)誤信息。 可以通過 DateTime::getLastErrors() 來探查解析是否存在錯(cuò)誤。
如果需要在格式字符串 format
參數(shù)中使用
上述表示格式的字符作為一個(gè)普通字符,請(qǐng)對(duì)其使用反斜線(\
)進(jìn)行轉(zhuǎn)義。
如果格式字符串參數(shù) format
中不包含 !
字符,
那么沒有在 format
參數(shù)中指明的字段,
在解析結(jié)果中將會(huì)被設(shè)置為系統(tǒng)當(dāng)前時(shí)間對(duì)應(yīng)的字段值。
如果格式字符串參數(shù) format
包含了 !
字符,
那么沒有在 format
參數(shù)中指明的字段,
以及在 !
左側(cè)對(duì)應(yīng)的字段,
在解析結(jié)果中將會(huì)被設(shè)置為 Unix epoch 時(shí)間對(duì)應(yīng)的字段。
The Unix epoch 為 1970-01-01 00:00:00 UTC。
time
用來表示日期時(shí)間的字符串。
timezone
DateTimeZone 對(duì)象, 表示在解析日期時(shí)間字符串的時(shí)候需要使用的時(shí)區(qū)。
如果忽略 timezone
參數(shù),
并且表示日期時(shí)間的字符串 time
中也不包含時(shí)區(qū)信息,
那么將會(huì)使用系統(tǒng)當(dāng)前時(shí)區(qū)作為解析結(jié)果對(duì)象的時(shí)區(qū)。
注意:
如果
time
參數(shù) 是 UNIX 時(shí)間戳格式(例如:946684800
), 或者其中已經(jīng)包含了時(shí)區(qū)信息(例如:2010-01-28T15:00:00+02:00
), 那么timezone
以及系統(tǒng)當(dāng)前時(shí)區(qū) 都將會(huì)被忽略。
返回一個(gè) DateTime 對(duì)象。 或者在失敗時(shí)返回 false
。
版本 | 說明 |
---|---|
5.3.9 |
新增 format 格式字符串中對(duì)于 + 格式字符的支持。
|
示例 #1 DateTime::createFromFormat() 例程
面向?qū)ο箫L(fēng)格
<?php
$date = DateTime::createFromFormat('j-M-Y', '15-Feb-2009');
echo $date->format('Y-m-d');
?>
過程化風(fēng)格
<?php
$date = date_create_from_format('j-M-Y', '15-Feb-2009');
echo date_format($date, 'Y-m-d');
?>
以上例程會(huì)輸出:
2009-02-15
示例 #2 DateTime::createFromFormat() 的復(fù)雜用法
<?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 格式化字符串中包含了需要進(jìn)行轉(zhuǎn)義的字符
<?php
echo DateTime::createFromFormat('H\h i\m s\s','23h 15m 03s')->format('H:i:s');
?>
以上例程的輸出類似于:
23:15:03