DateTime::createFromFormat

date_create_from_format

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

DateTime::createFromFormat -- date_create_from_format根據(jù)給定的格式解析日期時(shí)間字符串

說明

面向?qū)ο箫L(fēng)格

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

過程化風(fēng)格

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

time 參數(shù)給定的日期時(shí)間字符串, 根據(jù) format 參數(shù)給定的格式 解析為一個(gè)新的 DateTime 對象。

參數(shù)

format

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

format 參數(shù)中支持的字符
format 中的字符 解釋 示例
--- ---
dj 一個(gè)月中的第幾天,2 位數(shù)字表示,有前導(dǎo) 0 或者無前導(dǎo) 0 0131 或者 131
Dl 星期幾的文字表示 MonSun 或者 SundaySaturday
S 2 個(gè)字母表示的一個(gè)月中的第幾天(序數(shù)詞), 在進(jìn)行解析的時(shí)候會(huì)被忽略 stnd,rd 或者 th。
z 一年中的第幾天,從 0 開始 0365
--- ---
FM 文本表示的月份,例如 January 或者 Sept JanuaryDecember 或者 JanDec
mn 數(shù)值表示的月份,有前導(dǎo) 0 或者無前導(dǎo) 0 0112 or 112
--- ---
Y 4 位數(shù)字表示的年 例如:19992003
y 2 位數(shù)字表示的年, 可用的范圍是 1970 至 2069(不含) 例如: 9903 (表示 19992003
時(shí)間 --- ---
aA 上午、下午 ampm
g and h 12 小時(shí)制的小時(shí),有前導(dǎo) 0 或者無前導(dǎo) 0 112 或者 0112
GH 24 小時(shí)制的小時(shí),有前導(dǎo) 0 或者無前導(dǎo) 0 0230023
i 分鐘,有前導(dǎo) 0 0059
s 秒,有前導(dǎo) 0 0059
u 微秒,最多到 6 位數(shù)字 示例:45,654321
時(shí)區(qū) --- ---
e,O, PT 時(shí)區(qū)名稱,或者是以 UTC 時(shí)區(qū)為基準(zhǔn)的小時(shí)偏移量, 或者是以 UTC 為基準(zhǔn)的小時(shí)和分鐘的偏移量, 小時(shí)和分鐘之間用冒號(:)分隔。 示例:UTC,GMT, Atlantic/Azores+0200+02:00EST,MDT
完整的日期和時(shí)間 --- ---
U 從 Unix Epoch (January 1 1970 00:00:00 GMT) 開始計(jì)算的時(shí)間,以秒為單位 示例:1292177455
空白字符和分隔字符 --- ---
(空格) 一個(gè)空格字符或者一個(gè) tab 字符 示例:
# 可以是一下分隔符號中的任意一個(gè): ;, :/,., ,-,() 示例:/
;, :/,., ,,-,() 特殊字符 示例:-
? 隨機(jī)字節(jié) 示例:^ (需要注意的是, 對于 UTF-8 字符,可能會(huì)需要多個(gè) ?。 這種情況下,請使用 *
* 隨機(jī)字節(jié),直到遇到下一個(gè)有效的分隔符號或者數(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í)間字符串中的年、月和日, 但是對于時(shí)、分、秒字段會(huì)設(shè)置為 0.
+ 在格式字符串中使用這個(gè)格式表示字符, 并且所提供的日期時(shí)間字符串中包含除了格式字符之外的其他數(shù)據(jù)的話,不會(huì)發(fā)出一個(gè)錯(cuò)誤,而是發(fā)出一個(gè)警告。 使用 DateTime::getLastErrors() 方法 來檢測所給定的日期時(shí)間字符串中是否包含格式字符串指定的內(nèi)容之外的數(shù)據(jù)。

如果在格式字符串中包含不可識別的字符, 那么會(huì)導(dǎo)致解析失敗,并且在返回的結(jié)構(gòu)中附加一個(gè)錯(cuò)誤信息。 可以通過 DateTime::getLastErrors() 來探查解析是否存在錯(cuò)誤。

如果需要在格式字符串 format 參數(shù)中使用 上述表示格式的字符作為一個(gè)普通字符,請對其使用反斜線(\)進(jìn)行轉(zhuǎn)義。

如果格式字符串參數(shù) format 中不包含 ! 字符, 那么沒有在 format 參數(shù)中指明的字段, 在解析結(jié)果中將會(huì)被設(shè)置為系統(tǒng)當(dāng)前時(shí)間對應(yīng)的字段值。

如果格式字符串參數(shù) format 包含了 ! 字符, 那么沒有在 format 參數(shù)中指明的字段, 以及在 ! 左側(cè)對應(yīng)的字段, 在解析結(jié)果中將會(huì)被設(shè)置為 Unix epoch 時(shí)間對應(yīng)的字段。

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

time

用來表示日期時(shí)間的字符串。

timezone

DateTimeZone 對象, 表示在解析日期時(shí)間字符串的時(shí)候需要使用的時(shí)區(qū)。

如果忽略 timezone 參數(shù), 并且表示日期時(shí)間的字符串 time 中也不包含時(shí)區(qū)信息, 那么將會(huì)使用系統(tǒng)當(dāng)前時(shí)區(qū)作為解析結(jié)果對象的時(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 對象。 或者在失敗時(shí)返回 false。

更新日志

版本 說明
5.3.9 新增 format 格式字符串中對于 + 格式字符的支持。

范例

示例 #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

參見