PHP实战中知识总结 / 日期相关的类 - DateTimeInterface接口
PHP中的DateTimeInterface接口是为了给类DateTime类和DateTimeImmutable类做类型约束用的,不能使用用户自定义的类实现此接口。
PHP5.5.8起,尝试实现DateTimeInterface接口会产生致命错误。
一、方法
该接口定义了6个方法:
1、diff($datetime2, $absolute = false)
返回两个DateTime对象的差值。接受两个参数,第一个为要进行比较的日期DateTimeInterface对象,第二个参数为可选的表示是否差值必须是正数,如果为true则总是返回正数。默认为false。返回一个DateInterval对象来表示两个日期的差值,若比较失败则返回false。
2、format($format)
返回根据指定格式格式化后的日期。接受一个参数为日期的格式字符串。若失败则返回false。此方法不受区域设置影响。
3、getOffset
以秒为单位返回日期与当前时区偏移量。
4、getTimestamp
获取unix时间戳。
5、getTimezone
返回日期的时区信息类DateTimeZone的对象。
6、__wakeup
魔术方法,返回一个实例化的DateTime对象。
// diff方法实例
$date1 = new DateTime("2018-11-31");
$date2 = new DateTime("2018-11-04");
$interval = $date1->diff($date2,true);
dump($interval);
// diff方法打印结果
object(DateInterval)#226 (16) {
["y"] => int(0)
["m"] => int(0)
["d"] => int(27)
["h"] => int(0)
["i"] => int(0)
["s"] => int(0)
["f"] => float(0)
["weekday"] => int(0)
["weekday_behavior"] => int(0)
["first_last_day_of"] => int(0)
["invert"] => int(0)
["days"] => int(27)
["special_type"] => int(0)
["special_amount"] => int(0)
["have_weekday_relative"] => int(0)
["have_special_relative"] => int(0)
}
// diff方法返回值再执行format方法(因为diff方法返回值是个DateInterval对象)
echo $interval->format('%R%a days'); // +27 days
//该diff方法与时间函数date_diff 效果一致
$date3 = date_create("2018-11-31");
$date4 = date_create("2018-11-04");
$diff = date_diff($date3, $date4,true); // 运行结果是一样的
二、常量
定义了13个预定义常量:
const ATOM = 'Y-m-d\TH:i:sP';(示例:2005-08-15T15:52:01+00:00)
const COOKIE = 'l, d-M-Y H:i:s T';(示例:Monday, 15-Aug-2005 15:52:01 UTC)
const ISO8601 = 'Y-m-d\TH:i:sO';(示例:2005-08-15T15:52:01+0000)
const RFC822 = 'D, d M y H:i:s O';(示例:Mon, 15 Aug 05 15:52:01 +0000)
const RFC850 = 'l, d-M-y H:i:s T';(示例:Monday, 15-Aug-05 15:52:01 UTC)
const RFC1036 = 'D, d M y H:i:s O';(示例:Mon, 15 Aug 05 15:52:01 +0000)
const RFC1123 = 'D, d M Y H:i:s O';(示例:Mon, 15 Aug 2005 15:52:01 +0000)
const RFC2822 = 'D, d M Y H:i:s O';(示例:Mon, 15 Aug 2005 15:52:01 +0000)
const RFC3339 = 'Y-m-d\TH:i:sP'; // 同ATOM(自 PHP 5.1.3 版本可用)
const RFC3339_EXTENDED = 'Y-m-d\TH:i:s.vP';(示例:2005-08-15T15:52:01.000+00:00)// PHP7 可用
const RFC7231 = 'D, d M Y H:i:s \G\M\T';(示例:Wed, 31 Oct 2018 00:00:00 GMT)
const RSS = 'D, d M Y H:i:s O';(示例:Mon, 15 Aug 2005 15:52:01 +0000)
const W3C = 'Y-m-d\TH:i:sP';(示例:2005-08-15T15:52:01+00:00)
// 常量是php内置的预定义常量,需加上DATE_ 前缀
$date1 = new DateTime("2018-10-31");
dump($date1->format(DATE_RFC7231)); // string(29) "Wed, 31 Oct 2018 00:00:00 GMT"
$date = date(DATE_RFC7231,time())
dump($date);;// string(29) "Sat, 28 Mar 2020 21:10:54 GMT"