PHP中的日期相关函数(二)
上回文章中我们介绍了三个时间日期相关的对象,不过它们的出镜频率并不是特别地高。今天学习的对象虽说可能不少人使用过,但是它的出镜频率也是非常低的。它们其实就是我们非常常用的那些面向过程的日期函数的面向对象式的封装。但,酒香不怕巷子深,好东西还是值得我们去深入的学习研究的,当然更好的情况是可以在面对不同的业务场景时灵活地使用这些对象才是我们学习的根本目的。
DateTime 对象
没错,今天我们学习的就是 DateTime 对象。从名字就可以看出,它就是一个标准的日期时间类。
$date = new DateTime('now', new DateTimeZone('Asia/Tokyo'));
echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
// 2020-09-29 09:47:57+09:00
$date = new DateTime();
echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
// 2020-09-29 10: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-d H:i:sP'), PHP_EOL;
// 2020-09-22 22:13:35+08:00
$date = DateTime::createFromImmutable(new DateTimeImmutable("2020-09-22 11:45"));
echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
// 2020-09-22 11:45:00+08:00
createFromFormat() 静态方法是按照指定的格式来生成 DateTime 时间对象。在这里我们指定的格式是我们中文常用的格式,后面紧跟着具体的日期。createFromImmutable() 则是通过 DateTimeImmutable 对象来创建 DateTime 对象。
DateTime 与 DateTimeImmutable
DateTimeImmutable 是日期表示对象,它与 DateTime 基本没什么区别,方法、属性都和 DateTime 是一样的,唯一的区别就是在后面介绍的操作方法中它不会修改自身,而是返回一个新的对象。在 DateTimeImmutable 对象中也有一个静态方法 createFromMutable() 是从 DateTime 对象创建一个 DateTimeImmutable 对象。
$di = new DateTimeImmutable("2020-09-22 11:45");
var_dump($di);
// object(DateTimeImmutable)#1 (3) {
// ["date"]=>
// string(26) "2020-09-22 11:45:00.000000"
// ["timezone_type"]=>
// int(3)
// ["timezone"]=>
// string(13) "Asia/Shanghai"
// }
var_dump($di->add(new DateInterval('P3D')));
// object(DateTimeImmutable)#4 (3) {
// ["date"]=>
// string(26) "2020-09-25 11:45:00.000000"
// ["timezone_type"]=>
// int(3)
// ["timezone"]=>
// string(13) "Asia/Shanghai"
// }
$date = new DateTime("2020-09-22 11:45");
var_dump($date);
// object(DateTime)#4 (3) {
// ["date"]=>
// string(26) "2020-09-22 11:45:00.000000"
// ["timezone_type"]=>
// int(3)
// ["timezone"]=>
// string(13) "Asia/Shanghai"
// }
var_dump($date->add(new DateInterval('P3D')));
// object(DateTime)#4 (3) {
// ["date"]=>
// string(26) "2020-09-25 11: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(new DateInterval('P3D'));
echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
// 2020-09-29 09:22:45+08:00
这里我们就是为当前的时间增加了3天,关于 DateInterval 对象的内容可以查阅上篇文章中的介绍。当然,除了增加之外,还有减少以及修改的方法。
$date->sub(new DateInterval('P3D'));
echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
// 2020-10-02 09:22:45+08:00
$date->modify('+5 day');
echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
// 2020-10-04 09:22:45+08:00
$date->modify('-4 day -4 hours');
echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
// 2020-09-30 05:22:45+08:00
sub() 方法就是给一个时间对象减少指定的时间间隔,而 modify() 方法就是根据参数来直接修改日期,比如我们这里测试了增加5天和减少4天4小时的操作。
$origin = new DateTime('now');
$target = new DateTime('2020-09-11');
$interval = $origin->diff($target);
echo $interval->format('%a days'), PHP_EOL;
echo $interval->format('%R%a days'), PHP_EOL;
// 18 days
// -18 days
diff() 方法就是返回两个日期之间的差值,相信这个方法不少人使用过它的面向过程的函数,也就是 date_diff() 函数,相对于其它方法来说,它的出镜率就非常高了。%R 返回的是符号位,如果是负号就是比指定的日期少了多少时间间隔。
设置日期时间
除了操作日期时间之外,我们在实例化 DateTime 对象之后,也可以为它重新指定日期。
$date = new DateTime();
$date->setDate(2020, 9, 25);
echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
// 2020-09-25 09:22:45+08:00
$date->setISODate(2020, 9, 25);
echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
// 2020-03-19 09:22:45+08:00
$date->setTime(14, 55);
echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
// 2020-10-03 14:55:00+08:00
$date->setDate(2020, 9, 33);
echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
// 2020-10-03 09:22:45+08:00
$date->setTime(14, 63);
echo $date->format('Y-m-d H:i:sP'), PHP_EOL;
// 2020-10-03 15:03:00+08:00
setDate() 方法就是指定日期,setTime() 方法是指定时间,它们是分开的两个方法哦。setISODate() 设置的是 ISO 标准时间,这又是另一套日期时间规范了,感兴趣的朋友可以自行查阅下相关的知识,这里就不多做赘述了。如果我们设置的日期不是一个正常的日期格式,比如我们在测试代码中设置了 9月33号 这个日期,那么它会自动向后延,输出的结果就是 10月3号 这个日期,包括 setTime() 方法也是可以这样顺延的。其实所有日期相关的对象、方法、函数都有这样的能力。
另外,我们还可以通过时间戳进行 DateTime 对象的日期时间设置。同理,时区也是可以单独设置的。
$date->setTimestamp(time()-84400);
echo $date->format('U = Y-m-d H:i:s'), PHP_EOL;
// 1601258165 = 2020-09-28 09:56:05
$date->setTimezone(new DateTimeZone('Asia/Tokyo'));
echo $date->format('U = Y-m-d H:i:s'), PHP_EOL;
// 1601258165 = 2020-09-28 10:56:05
获取属性及错误信息
既然 DateTime 对象有这么多设置的东西,那么相对应的它也有一些属性是可以让我们获取的。
echo $date->getOffset(), PHP_EOL;
// 32400
echo $date->getTimestamp(), PHP_EOL;
// 1601258070
var_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] => Double timezone specification
// )
// [error_count] => 1
// [errors] => Array
// (
// [0] => The timezone could not be found in the database
// )
// )
try {
$date = new DateTime('asdfasdf');
} catch (Exception $e) {
echo $e->getMessage(), PHP_EOL;
}
// DateTime::__construct(): Failed to parse time string (asdfasdf) at position 0 (a): The timezone could not be found in the database
第一段代码就是以面向过程的函数方式来创建的一个 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
关注公众号:【硬核项目经理】获取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料
知乎、公众号、抖音、头条搜索【硬核项目经理】
B站ID:482780532
PHP中的日期相关函数(二)的更多相关文章
- PHP中的日期相关函数(三)
之前我们已经介绍过了 PHP 的一些相关的日期操作对象,今天我们就来学习剩下的那些面向过程的使用方式.当然,如果是和 DateTime 类中相似的方法我们就不再进行介绍了.另外,Date() 和 ti ...
- PHP中的日期相关函数(一)
日期相关的操作函数是我们在日常的工作开发中最常接触到的功能.当然,大部分同学可能最多用到的就是 date() . time() 这两个函数,我们今天先不讲这两个函数,或许后面的文章也不太会讲它们,毕竟 ...
- Day029 JDK8中新日期和时间API (二)
# JDK8中新日期和时间API (二) Instant介绍 Instant:时间线上的一个瞬时点. 这可能被用来记录应用程序中的事件时间 戳. 在处理时间和日期的时候,我们通常会想到年,月,日,时, ...
- C#中的日期处理函数
C#中的日期处理函数 //2013年4月24日 this.TextBox6.Text = System.DateTime.Now.ToString("D"); //2013-4-2 ...
- 谈谈javascript中的日期Date对象
一.日期对象 在javascript中并没有日期型的数据类型,但是提供了一个日期对象可以操作日期和时间. 日期对象的创建: new Date();二.将日期对象转换为字符串 将日期对象转换为字 ...
- 34 网络相关函数(二)——live555源码阅读(四)网络
34 网络相关函数(二)——live555源码阅读(四)网络 34 网络相关函数(二)——live555源码阅读(四)网络 2)socketErr 套接口错误 3)groupsockPriv函数 4) ...
- matlab中各种高斯相关函数
matlab中各种高斯相关函数 matlab, 高斯函数, 高斯分布 最常见的是产生服从一维标准正态分布的随机数 n=100; x=randn(1,n) 实现服从任意一维高斯分布的随机数 u=10 ...
- MYSQL中关于日期处理的函数
< DOCTYPE HTML PUBLIC -WCDTD HTML TransitionalEN> MySQL数据库中SQL语句中 关于日期.时间\时间戳的函数 一 MySQL 获得当 ...
- Android中关于日期时间与时区的使用总结
在开发Android的过程中,出现过几次由于日期时间导致的问题,而且主要是由于时区的原因导致,所以一直想总结一下,形成一个良好的开发规范. 一.Unix时间戳 Unix时间戳(Unix tim ...
随机推荐
- ACM学习笔记:二叉堆
title : 堆 date : 2021-8-3 tags : ACM,数据结构 什么是堆 堆是一棵具有特定性质的二叉树,堆的基本要求是堆中所有结点的值必须大于等于(或小于等于)其孩子结点的值,这也 ...
- .net 温故知新:【5】异步编程 async await
1.异步编程 异步编程是一项关键技术,可以直接处理多个核心上的阻塞 I/O 和并发操作. 通过 C#.Visual Basic 和 F# 中易于使用的语言级异步编程模型,.NET 可为应用和服务提供使 ...
- Nginx 真实的 IP
配置 Nginx 如果你的 Java 项目使用了 Nginx 代理,那么还需要进行以下配置,才能顺利获取到真实的 IP,否则只能获取到 127.0.0.1. 在 Nginx 的配置文件里,找到你 Ja ...
- Spring-Boot的动态代理AOP原理
前言 Spring AOP使用了动态代理技术,动态代理在业界比较流行的实现方式有,CGLIB,Javassist,ASM等等. Spring动态代理实现方式 Spring采用了JDK和CGLIB两种方 ...
- 使用SuperSocket实现自定义协议C/S设计
一.简介: 21世纪是出于互联网+的时代,许多传统行业和硬件挂钩的产业也逐步转向了系统集成智能化,简单来说就是需要软硬件的结合.这时,软硬件通讯便是这里面最主要的技术点,我们需要做到的是让硬件能够听懂 ...
- 【springcloud】一文带你搞懂API网关
作者:aCoder2013 https://github.com/aCoder2013/blog/issues/35 前言 假设你正在开发一个电商网站,那么这里会涉及到很多后端的微服务,比如会员.商品 ...
- 【VLC开发】libvlc_new函数参数
项目中有视频监控的需求,找了vlc这个开源视频工具,在获取实例参数时遇到了问题, 要得到VLC的全部参数有两种方法, 1 只要在创建时加上"--longhelp"和"-- ...
- jQuery中ajax请求的六种方法(三、四):$.getJSON()方法
4.$.getJSON()方法 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- 微信小程序学习笔记二 数据绑定 + 事件绑定
微信小程序学习笔记二 1. 小程序特点概述 没有DOM 组件化开发: 具备特定功能效果的代码集合 体积小, 单个压缩包体积不能大于2M, 否则无法上线 小程序的四个重要的文件 *js *.wxml - ...
- 巧用模糊实现视觉的 3D 效果
本文较短,将介绍巧用模糊实现视觉 3D 效果的技巧. 我们都知道,在正常的视觉效果中,离我们越近的通常我们会看的越清晰,而离我们较远则相对没那么清晰~ 我们可以利用清晰与模糊两种状态来构建视差效果.像 ...