DateTime::createFromFormat

date_create_from_format

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

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

說明

面向對象風格

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

過程化風格

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

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

參數(shù)

format

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

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

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

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

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

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

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

time

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

timezone

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

如果忽略 timezone 參數(shù), 并且表示日期時間的字符串 time 中也不包含時區(qū)信息, 那么將會使用系統(tǒng)當前時區(qū)作為解析結果對象的時區(qū)。

注意:

如果 time 參數(shù) 是 UNIX 時間戳格式(例如:946684800), 或者其中已經(jīng)包含了時區(qū)信息(例如:2010-01-28T15:00:00+02:00), 那么 timezone 以及系統(tǒng)當前時區(qū) 都將會被忽略。

返回值

返回一個 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

參見