PHP 时间日期处理类
Posted 二环狄仁杰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP 时间日期处理类相关的知识,希望对你有一定的参考价值。
涉及 1 个接口, 5 个类。
DateTimeInterface:
DateTime:可变时间对象,修改的都是自身
DateTimeImmutable:不可变时间对象,返回一个新的。和DateTime表现一样,差别是:设置时间时区日期时不会修改自身,而是返回一个全新的对象。
DateTimeZone:
DateInterval:
DatePeriod:实现了 Traversable 接口,可被遍历
DateTime DateTimeImmutable 类
创建一个日期时间对象;构造方法接收的参数必须是一定的格式
$do=newDateTime('-1day',newDateTimeZone('Asia/Shanghai'));
除了那些固定的格式,有时候还需要处理其他乱七八糟的,可以用
DateTime::createFromFormat('M j, Y H:i:s','June 6, 2016 22:00:00');
,第一个参数对应好第二个就行;查看支持的格式
两天后的时间,查看
DateInterval
类更多可用格式
$do->add(new\DateInterval('P2D'))
// 用P开头,如果两个时间的区间内还包含了时间,用T(譬如:P1MT1M1个月零一分钟)
三天前的时间
$do->sub(new\DateInterval('P3D'))
计算日期差,查看
format()
方法更多可用格式
$d = new \DateTime('2010-01-2', new \DateTimeZone('Asia/Shanghai'));
$d1 = new \DateTime('20150303', new \DateTimeZone('Asia/Shanghai'));
$q = $d1->diff($d);
// 可以把下面这个对象打印出来看看,里面还有很多有用信息
echo $q->format("%y年%m个月%d天"); // 输出 5年2个月1天
格式化时间字符串
$d = \DateTime::createFromFormat('Y-m-d', '2015-12-12', new \DateTimeZone('Asia/Shanghai'));
var_dump($d); // 返回一个DateTime对象
获取错误
\DateTime::getLastErrors()
譬如在·createFromFormat·的时候,就可能会发生错误,该静态方法就可以获取到
修改日期时间对象
$d->modify('-2 months'); // 返回DateTime对象
~~没搞懂有了这个方法,add()和sub()方法还有什么意义?都可以修改时间~~
差别是:modify接收字符串参数,add和sub接收DateInterval类型的对象
设置日期
根据年月日三个参数返回一个DateTime对象(失败false),能自动修正,譬如传13月,能自动转成次年01月
$datetime = \DateTime::createFromFormat('Y.m.d', '2016.12.12');
$datetime->setDate(2015, 13, 13);
var_dump($datetime); // 返回一个datetime对象,2016-01-13
方法二:
setISODate(年, 周, 天)
$datetime->setDate(2008, 2, 5);// 返回 2008年的第二周的第五天 的DateTime对象
设置时间
$datetime = \DateTime::createFromFormat('Y.m.d', '2016.12.12');
$datetime->setTime(15, 31, 58);
var_dump($datetime); // 返回一个datetime对象,2016-12-12 15:31:58.000000
方法二:
$datetime->setTimestamp(1171502725); // 通过时间戳方式来设置
设置时区;查看php支持的全部时区
$datetime->setTimezone(new DateTimeZone('utc')); //
DateTimeZone 类,时区相关
时区
$tz = new DateTimeZone('asia/shanghai');
$tz = $tz->getLocation(); // 返回四个值的数组,包含经纬度等
时差
$tz = new DateTimeZone('asia/shanghai');
$tz = $tz->getOffset(new \DateTime()); // 返回new \DateTime()这个时间和GMT时间的时差秒数
查看时区
// 查看所有支持的时区
$tz = DateTimeZone::listIdentifiers(DateTimeZone::ASIA);
DateInterval 类,用于表示时间间隔。
譬如DateTime类的diff()方法返回的就是一个DateInterval对象。
构造方法只接受 P3Y
这种参数
DateInterval::createFromDateString('+2 days');
方法只接受各种字符串日期不接受P开头那种参数
还有个 format()
方法可以格式化出时间差,比如两个日期相隔了xx年xx月xx日这种需求。
DatePeriod 类
主要可用于生成一定间隔的时间,可用于生成譬如每月22日还款,一共还10期这种需求。
$start = new \DateTime('2020-12-22');
$end = new \DateTime('2025-12-19');
$interval = new DateInterval('P1M');
// 从2020-12-22开始,输出4个日期,每个间隔1个月
$tz = new \DatePeriod($start, $interval, 3);
// 从2020-12-22开始,输出很多个时间,每个间隔1个月,直到$end时间
$tz = new \DatePeriod($start, $interval, $end);
foreach($tz as $k=>$v){
var_dump($k, $v). PHP_EOL;
}
php5.6.5之后还有 getStartDate()
和 getEndDate()
和 getDateInterval()
三个方法可供使用,不过目前PHPstorm并没有相关语法提示(原因是PS内置的还是5.3)。。。
以上是关于PHP 时间日期处理类的主要内容,如果未能解决你的问题,请参考以下文章