$date=newDateTime('now',newDateTimeZone('Asia/Tokyo'));echo$date->format('Y-m-dH:i:sP'),PHP_EOL;//2020-09-2909:47:57+09:00$date=newDateTime();echo$date->format('Y-m-dH:i:sP'),PHP_EOL;//2020-09-2910:22:45+08:00
我们可以为它指定时间,指定时区。在第一行的测试代码中,我们指定了韶光为 now ,也便是当前韶光,这里还可以通报字符串的韶光格式给这个参数。第二个参数便是指定时区,我们通报了日本的区域时区,以是它的 P 格式化后输入的便是 +9:00 ,也便是东九区,比我们的北京韶光东八区早 1 个小时。DateTime 实例化时不通报任何参数的话,默认情形便是当前的韶光以及 php.ini 中指定的时区。
还可以通过其它的办法来创建 DateTime 工具。
$date=DateTime::createFromFormat('Y年m月j日H时i分s秒','2020年09月22日22时13分35秒');echo$date->format('Y-m-dH:i:sP'),PHP_EOL;//2020-09-2222:13:35+08:00$date=DateTime::createFromImmutable(newDateTimeImmutable("2020-09-2211:45"));echo$date->format('Y-m-dH:i:sP'),PHP_EOL;//2020-09-2211:45:00+08:00
createFromFormat() 静态方法是按照指定的格式来天生 DateTime 韶光工具。在这里我们指定的格式是我们中文常用的格式,后面紧随着详细的日期。createFromImmutable() 则是通过 DateTimeImmutable 工具来创建 DateTime 工具。
DateTime 与 DateTimeImmutable
DateTimeImmutable 这天期表示工具,它与 DateTime 基本没什么差异,方法、属性都和 DateTime 是一样的,唯一的差异便是在后面先容的操作方法中它不会修正自身,而是返回一个新的工具。在 DateTimeImmutable 工具中也有一个静态方法 createFromMutable() 是从 DateTime 工具创建一个 DateTimeImmutable 工具。
$di=newDateTimeImmutable("2020-09-2211:45");var_dump($di);//object(DateTimeImmutable)#1(3){//["date"]=>//string(26)"2020-09-2211:45:00.000000"//["timezone_type"]=>//int(3)//["timezone"]=>//string(13)"Asia/Shanghai"//}var_dump($di->add(newDateInterval('P3D')));//object(DateTimeImmutable)#4(3){//["date"]=>//string(26)"2020-09-2511:45:00.000000"//["timezone_type"]=>//int(3)//["timezone"]=>//string(13)"Asia/Shanghai"//}$date=newDateTime("2020-09-2211:45");var_dump($date);//object(DateTime)#4(3){//["date"]=>//string(26)"2020-09-2211:45:00.000000"//["timezone_type"]=>//int(3)//["timezone"]=>//string(13)"Asia/Shanghai"//}var_dump($date->add(newDateInterval('P3D')));//object(DateTime)#4(3){//["date"]=>//string(26)"2020-09-2511:45:00.000000"//["timezone_type"]=>//int(3)//["timezone"]=>//string(13)"Asia/Shanghai"//}
从上面的测试代码就可以看出 DateTimeImmutable 在利用 add() 方法之后返回的工具是一个新的工具,object(DateTimeImmutable)#1 (3) 变成了 object(DateTimeImmutable)#4 (3) 。而 DateTime 则是在自身进行的修正,工具标识符并没有发生改变。
DateTime 操作上文中 add() 方法便是增加日期的方法,它须要一个 DateInterval 韶光间隔工具作为参数,然后就会给对应的日期增加指定的韶光间隔。
$date->add(newDateInterval('P3D'));echo$date->format('Y-m-dH:i:sP'),PHP_EOL;//2020-09-2909:22:45+08:00
这里我们便是为当前的韶光增加了3天,关于 DateInterval 工具的内容可以查阅上篇文章中的先容。当然,除了增加之外,还有减少以及修正的方法。
$date->sub(newDateInterval('P3D'));echo$date->format('Y-m-dH:i:sP'),PHP_EOL;//2020-10-0209:22:45+08:00$date->modify('+5day');echo$date->format('Y-m-dH:i:sP'),PHP_EOL;//2020-10-0409:22:45+08:00$date->modify('-4day-4hours');echo$date->format('Y-m-dH:i:sP'),PHP_EOL;//2020-09-3005:22:45+08:00
sub() 方法便是给一个韶光工具减少指定的韶光间隔,而 modify() 方法便是根据参数来直接修正日期,比如我们这里测试了增加5天和减少4天4小时的操作。
$origin=newDateTime('now');$target=newDateTime('2020-09-11');$interval=$origin->diff($target);echo$interval->format('%adays'),PHP_EOL;echo$interval->format('%R%adays'),PHP_EOL;//18days//-18days
diff() 方法便是返回两个日期之间的差值,相信这个方法不少人利用过它的面向过程的函数,也便是 date_diff() 函数,相对付其它方法来说,它的出镜率就非常高了。%R 返回的是符号位,如果是负号便是比指定的日期少了多少韶光间隔。
设置日期韶光除了操作日期韶光之外,我们在实例化 DateTime 工具之后,也可以为它重新指定日期。
$date=newDateTime();$date->setDate(2020,9,25);echo$date->format('Y-m-dH:i:sP'),PHP_EOL;//2020-09-2509:22:45+08:00$date->setISODate(2020,9,25);echo$date->format('Y-m-dH:i:sP'),PHP_EOL;//2020-03-1909:22:45+08:00$date->setTime(14,55);echo$date->format('Y-m-dH:i:sP'),PHP_EOL;//2020-10-0314:55:00+08:00$date->setDate(2020,9,33);echo$date->format('Y-m-dH:i:sP'),PHP_EOL;//2020-10-0309:22:45+08:00$date->setTime(14,63);echo$date->format('Y-m-dH:i:sP'),PHP_EOL;//2020-10-0315:03:00+08:00
setDate() 方法便是指定日期,setTime() 方法是指定时间,它们是分开的两个方法哦。setISODate() 设置的是 ISO 标准韶光,这又是另一套日期韶光规范了,感兴趣的朋友可以自行查阅下干系的知识,这里就不多做赘述了。如果我们设置的日期不是一个正常的日期格式,比如我们在测试代码中设置了 9月33号 这个日期,那么它会自动向后延,输出的结果便是 10月3号 这个日期,包括 setTime() 方法也是可以这样顺延的。实在所有日期干系的工具、方法、函数都有这样的能力。
其余,我们还可以通过韶光戳进行 DateTime 工具的日期韶光设置。同理,时区也是可以单独设置的。
$date->setTimestamp(time()-84400);echo$date->format('U=Y-m-dH:i:s'),PHP_EOL;//1601258165=2020-09-2809:56:05$date->setTimezone(newDateTimeZone('Asia/Tokyo'));echo$date->format('U=Y-m-dH:i:s'),PHP_EOL;//1601258165=2020-09-2810:56:05
获取属性及缺点信息
既然 DateTime 工具有这么多设置的东西,那么相对应的它也有一些属性是可以让我们获取的。
echo$date->getOffset(),PHP_EOL;//32400echo$date->getTimestamp(),PHP_EOL;//1601258070var_dump($date->getTimezone());//object(DateTimeZone)#6(2){//["timezone_type"]=>//int(3)//["timezone"]=>//string(10)"Asia/Tokyo"//}
getOffset() 方法便是获取得我们与标准时区的差值,也便是对应的北京相差 8 个小时的信息,这个在之前的文章中与 DateTimeZone 工具的同名方法的浸染是类似的。getTimestamp() 和 getTimezone() 方法相信也不用多阐明了,一个是返回当前 DateTime 工具对应的韶光戳,一个是返回一个时区工具。
末了,我们再来看看 DateTime() 工具的缺点处理。DateTime 工具实在也是可以用过程化的办法来写的,以是它供应了一个 getLastErrors() 方法,不过我们在利用面向工具的办法时,DateTime 工具会以非常的形式进行抛出。
$date=date_create('asdfasdf');print_r(DateTime::getLastErrors());//Array//(//[warning_count]=>1//[warnings]=>Array//(//[6]=>Doubletimezonespecification//)//[error_count]=>1//[errors]=>Array//(//[0]=>Thetimezonecouldnotbefoundinthedatabase//)//)try{$date=newDateTime('asdfasdf');}catch(Exception$e){echo$e->getMessage(),PHP_EOL;}//DateTime::__construct():Failedtoparsetimestring(asdfasdf)atposition0(a):Thetimezonecouldnotbefoundinthedatabase
第一段代码便是以面向过程的函数办法来创建的一个 DateTime 工具,它不会抛出非常,这样我们就可以通过 getLastErrors() 方法得到缺点信息。但是现在还是更推举以面向工具的办法来操作 DateTime ,以是我们该当只管即便利用第二段代码的办法来处理缺点信息。
总结怎么样,DateTime 工具的是不是很故意思?思考一下,我们日常的很多日期操作是不是也可以通过它来实现了。关于 DateTimeImmutable 的内容就不会再单独讲解了,大家可以自己查阅一下干系的资料,由于内容实在都是和 DateTime 一样的,唯一的差异在上文中也已经解释了。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/13.PHP中的日期干系函数(二).php
参考文档:
https://www.php.net/manual/zh/class.datetime.php
https://www.php.net/manual/zh/class.datetimeimmutable.php