PHP 时间日期处理类

Posted 二环狄仁杰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP 时间日期处理类相关的知识,希望对你有一定的参考价值。

 涉及 1 个接口, 5 个类。

 
   
   
 
  1. DateTimeInterface

  2. DateTime:可变时间对象,修改的都是自身

  3. DateTimeImmutable:不可变时间对象,返回一个新的。和DateTime表现一样,差别是:设置时间时区日期时不会修改自身,而是返回一个全新的对象。

  4. DateTimeZone

  5. DateInterval

  6. DatePeriod:实现了 Traversable 接口,可被遍历

DateTime DateTimeImmutable 类

  1. 创建一个日期时间对象;构造方法接收的参数必须是一定的格式

$do=newDateTime('-1day',newDateTimeZone('Asia/Shanghai'));

除了那些固定的格式,有时候还需要处理其他乱七八糟的,可以用

DateTime::createFromFormat('M j, Y H:i:s','June 6, 2016 22:00:00');,第一个参数对应好第二个就行;查看支持的格式

  1. 两天后的时间,查看 DateInterval类更多可用格式

$do->add(new\DateInterval('P2D')) // 用P开头,如果两个时间的区间内还包含了时间,用T(譬如:P1MT1M1个月零一分钟)

  1. 三天前的时间

$do->sub(new\DateInterval('P3D'))

  1. 计算日期差,查看 format()方法更多可用格式

 
   
   
 
  1. $d = new \DateTime('2010-01-2', new \DateTimeZone('Asia/Shanghai'));


  2. $d1 = new \DateTime('20150303', new \DateTimeZone('Asia/Shanghai'));


  3. $q = $d1->diff($d);


  4. // 可以把下面这个对象打印出来看看,里面还有很多有用信息


  5. echo $q->format("%y年%m个月%d天"); // 输出 5年2个月1天

  1. 格式化时间字符串

 
   
   
 
  1. $d = \DateTime::createFromFormat('Y-m-d', '2015-12-12', new \DateTimeZone('Asia/Shanghai'));


  2. var_dump($d); // 返回一个DateTime对象

  1. 获取错误

\DateTime::getLastErrors() 譬如在·createFromFormat·的时候,就可能会发生错误,该静态方法就可以获取到

  1. 修改日期时间对象

 
   
   
 
  1. $d->modify('-2 months'); // 返回DateTime对象


  2. ~~没搞懂有了这个方法,add()和sub()方法还有什么意义?都可以修改时间~~


  3. 差别是:modify接收字符串参数,addsub接收DateInterval类型的对象

  1. 设置日期

根据年月日三个参数返回一个DateTime对象(失败false),能自动修正,譬如传13月,能自动转成次年01月

 
   
   
 
  1. $datetime = \DateTime::createFromFormat('Y.m.d', '2016.12.12');

  2. $datetime->setDate(2015, 13, 13);

  3. var_dump($datetime); // 返回一个datetime对象,2016-01-13




  4. 方法二:


  5. setISODate(年, 周, 天)


  6. $datetime->setDate(2008, 2, 5);// 返回 2008年的第二周的第五天 的DateTime对象

  1. 设置时间

 
   
   
 
  1. $datetime = \DateTime::createFromFormat('Y.m.d', '2016.12.12');

  2. $datetime->setTime(15, 31, 58);

  3. var_dump($datetime); // 返回一个datetime对象,2016-12-12 15:31:58.000000




  4. 方法二:


  5. $datetime->setTimestamp(1171502725); // 通过时间戳方式来设置

  1. 设置时区;查看php支持的全部时区

 
   
   
 
  1. $datetime->setTimezone(new DateTimeZone('utc')); //

DateTimeZone 类,时区相关

  1. 时区

 
   
   
 
  1. $tz = new DateTimeZone('asia/shanghai');

  2. $tz = $tz->getLocation(); // 返回四个值的数组,包含经纬度等

  1. 时差

 
   
   
 
  1. $tz = new DateTimeZone('asia/shanghai');

  2. $tz = $tz->getOffset(new \DateTime()); // 返回new \DateTime()这个时间和GMT时间的时差秒数

  1. 查看时区

 
   
   
 
  1. // 查看所有支持的时区

  2. $tz = DateTimeZone::listIdentifiers(DateTimeZone::ASIA);

DateInterval 类,用于表示时间间隔。

譬如DateTime类的diff()方法返回的就是一个DateInterval对象。

构造方法只接受 P3Y这种参数

DateInterval::createFromDateString('+2 days');方法只接受各种字符串日期不接受P开头那种参数

还有个 format()方法可以格式化出时间差,比如两个日期相隔了xx年xx月xx日这种需求。

DatePeriod 类

主要可用于生成一定间隔的时间,可用于生成譬如每月22日还款,一共还10期这种需求。

 
   
   
 
  1. $start = new \DateTime('2020-12-22');

  2. $end = new \DateTime('2025-12-19');

  3. $interval = new DateInterval('P1M');

  4. // 从2020-12-22开始,输出4个日期,每个间隔1个月

  5. $tz = new \DatePeriod($start, $interval, 3);

  6. // 从2020-12-22开始,输出很多个时间,每个间隔1个月,直到$end时间

  7. $tz = new \DatePeriod($start, $interval, $end);

  8. foreach($tz as $k=>$v){

  9. var_dump($k, $v). PHP_EOL;

  10. }

php5.6.5之后还有 getStartDate()getEndDate()getDateInterval()三个方法可供使用,不过目前PHPstorm并没有相关语法提示(原因是PS内置的还是5.3)。。。


以上是关于PHP 时间日期处理类的主要内容,如果未能解决你的问题,请参考以下文章

PHP 时间日期处理类

PHP Wordpress更好的日期片段

如何从片段中调用 getSupportFragmentManager()?

PHP日期操作类代码-农历-阳历转换闰年计算天数等

PHP日期操作类代码-农历-阳历转换闰年计算天数等

在片段中创建日期选择器