date_create_from_format()

1. 定义

该函数根据给定的格式解析指定日期时间字符串为DateTime对象。 该对象是一个有三个参数的关联数组,分别是日期时间(date)、时区类型(timezone_type)和时区(timezone)。

2. 语法

public static DateTime::createFromFormat ( string $format , string $time [, DateTimeZone $timezone ] ) : DateTime

date_create_from_format ( string $format , string $time [, DateTimeZone $timezone ] ) : DateTime

3. 参数说明

参数 可选性 数据类型 描述
$format 必需 字符串 符合规范的解析日期/时间的格式化字符串
$time 必需 字符串 符合日期/时间格式的时间字符串,默认为当前时间
$timezone 可选 DateTimeZone 时区,默认为当前设置的时区

其中,$format参数有以下几种符号格式规则(注意,下面的结果有些与当前时间有关!):

符号 说明 示例
Y 四位数字的年份表示 2019年使用Y年,可得出:2019
y 两位数字的年份表示 77年使用y年,可得出:1977
FM 全写或简写的英文月份表示 August月使用F月,可得出:2019-08-19aug月使用M月,可得出:2019-08-19
mn 有前导零或无前导零的数字月份表示 09月使用m月,可得出:2019-09-199月使用n月,可得出:2019-09-19
z 一年中的第几天,从0开始 364使用z,可得出:2019-12-31
dj 有前导零或无前导零的一个月中的第几天表示 2019-08-01使用Y-m-d,可得出:2019-08-01
S 使用两个字母的缩写表示一个月的第几天,会自动忽略日期后面的stndrdth 2019-08-15th使用Y-m-dS,可得出:2019-08-15
Dl 全写或简写的星期表示 Monday使用D,可得出:2019-08-19
Aa 表示一天中的上午或下午 4am使用Ha,可得出:04:00:00.0000004pm使用Ha,可得出:16:00:00.000000
gh 有前导零或无前导零的12小时制的小时 6使用h,可得出:06:00:00.000000
GH 有前导零或无前导零的24小时制的小时 6使用H,可得出:06:00:00.000000
i 有前导零的分钟表示 6:32使用H:i,可得出:06:32:00.000000
s 有前导零的秒数表示 6:32:59使用H:i:s,可得出:06:32:59.000000
u 微秒表示,至多精确到六位数 6:32:59.123456使用H:i:s.u,可得出:06:32:59.123456
eOPT 时区名称,或者是以UTC时区为基准的小时偏移量,或者是以UTC为基准的小时和分钟的偏移量,小时和分钟之间用冒号(:)分隔 +2:00使用P,可得出timezone+02:00
空格 表示要格式化的时间字符串中的空格 2019 08 19使用Y m d可得出:2019-08-19
# 表示这几个分隔符中的一个:;.:/,-() 2019-08-19可使用Y#m#d,得出:2019-08-19
;.:/,-() 表示各自的含义 2019-08-19可使用Y-m-d,得出:2019-08-19
? 表示任一一个单字节字符 2019/08/19可使用Y?m?d,得出:2019-08-19(含有多个字节的字符时,使用*
* 表示任何的字符,直到遇到下一个有效的分隔符号或数值 2019年08月19日可使用Y*m*d*,得出:2019-08-19
! 将符号左侧的所有字段(年、月、日、时、分、秒、微秒以及时区)重置到 Unix Epoch 时间 2019年08月19日使用Y*m*d*!,可看到结果:1970-01-01
| 将尚未被解析的字段,也即格式字符串中未明确指定的字段 (年、月、日、时、分、秒、微秒以及时区) 重置到 Unix Epoch 时间 2019年08月19日使用Y*m*d*|,可看到结果中的时分秒被重置为0
+ 在格式字符串中使用这个格式表示字符, 并且所提供的日期时间字符串中包含除了格式字符之外的其他数据的话,不会发出一个错误,而是发出一个警告 2019-08-19使用Y-+m-+d,可看到结果:2019-08-19

4. 示例

<?php

// date_create_from_format()
// 根据给定的格式解析指定日期时间字符串为`DateTime`对象

$format = 'Y年m月d日 H*i*s*';
$time = '2019年08月19日 13时14分45秒';
$res = date_create_from_format($format, $time);
var_dump($res);
/* 输出:
object(DateTime)#1 (3) {
    ["date"]=>
    string(26) "2019-08-19 13:14:45.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(13) "Asia/Shanghai"
  }
   */

5. 延展阅读

  • date_create():根据指定时间,创建一个DateTime对象
  • date_get_last_errors():获取解析日期时间字符串时发生的警告和错误信息数组
  • checkdate():验证一个格里高利历(俗称公历)日期是否合法
  • strptime():解析使用strftime()函数生成的日期时间,返回一个时间信息数组