之前我们已经介绍过了 PHP 的一些相关的日期操作对象,今天我们就来学习剩下的那些面向过程的使用方式。当然,如果是和 DateTime 类中相似的方法我们就不再进行介绍了。另外,Date() 和 time() 这两个非常常用的函数也不会进行介绍,因为大家都已经用滥了,所以我们也就不浪费宝贵的学习资源了。

检查日期

首先,我们先学习一个函数,用来日期是否正确。

var_dump(checkdate(2, 29, 2020)); // bool(true)
var_dump(checkdate(2, 29, 2021)); // bool(false)

2020年是闰年,所以有 2月29号 ,而 2021 年没有 2月29号 ,这个 checkdate() 函数就是用来检测给定的日期是否正确。它的参数顺序是 月 、 日 、 年,都是必须的参数。

获取及设置时区

关于时区内容的学习,我们在 DateTimeZone 类的学习中已经详细的讲解过了,在面向过程的方式中,我们也可以通过两个简单的函数来获取和设置当前系统运行环境的时区信息。

var_dump(date_default_timezone_get()); // string(13) "Asia/Shanghai"

var_dump(date("Y-m-d H:i:s")); // string(19) "2020-10-09 08:41:11"

date_default_timezone_set("Asia/Tokyo");

var_dump(date("Y-m-d H:i:s")); // string(19) "2020-10-09 09:41:11"

使用 date_default_timezone_get() 就可以获取当前系统环境中的时区信息,它是有优先顺序的,最优先的是使用 date_default_timezone_set() 设置的时区,然后是 php.ini 文件中所设置的时区信息,最后如果都没有设置的话,就会根据操作系统的时区设置来确定最终我们运行环境中的时区到底是哪里。

格式化转换日期

这里的转换日期,其实就是将日期内容输出为一个详细的数组。

print_r(date_parse("2020-12-12 10:00:00.5"));
// Array
// (
// [year] => 2020
// [month] => 12
// [day] => 12
// [hour] => 10
// [minute] => 0
// [second] => 0
// [fraction] => 0.5
// [warning_count] => 0
// [warnings] => Array
// (
// ) // [error_count] => 0
// [errors] => Array
// (
// ) // [is_localtime] =>
// ) $date = "6.1.2020 13:00+01:00";
print_r(date_parse_from_format("j.n.Y H:iP", $date));
// Array
// (
// [year] => 2020
// [month] => 1
// [day] => 6
// [hour] => 13
// [minute] => 0
// [second] => 0
// [fraction] => 0
// [warning_count] => 0
// [warnings] => Array
// (
// ) // [error_count] => 0
// [errors] => Array
// (
// ) // [is_localtime] => 1
// [zone_type] => 1
// [zone] => 3600
// [is_dst] =>
// )

date_parse() 与 date_parse_from_format() 都是转换日期内容为详细数组的函数,它们的区别是 date_parse_from_format() 函数可以指定日期和格式,这样传递进来的日期内容就可以是各种格式类型的。它们生成的数组里面的内容字段名非常清晰,包括年、月、时、分、错误信息等内容。

计算太阳起落时间

这个函数就比较有意思了,它可以根据我们指定的一个日期来返回太阳升起和落下的时间。

$sun_info = date_sun_info(strtotime("2020-12-12"), 113.037211, 28.203167);
foreach ($sun_info as $key => $val) {
echo "$key: " . date("H:i:s", $val) . "\n";
} // sunrise: 08:03:54
// sunset: 05:58:14
// transit: 19:01:04
// civil_twilight_begin: 09:58:56
// civil_twilight_end: 04:03:11
// nautical_twilight_begin: 11:20:07
// nautical_twilight_end: 02:42:01
// astronomical_twilight_begin: 12:27:37
// astronomical_twilight_end: 01:34:31

sunrise 就是日出,sunset 就是日落,另外还有 twilight 也就是暮光、黄昏之类的时间,先不管它的准确度如何,这个函数以及与 sun 相关的这些函数都是比较有意思的函数。

获得日期、时间详细信息

上面提到过 date_parse() 函数是将标准日期格式转换为一个详细的日期信息数组,在这里,还有其它的函数也是实现类似的功能,并且内容更加的丰富。

var_dump(getdate());
// array(11) {
// ["seconds"]=>
// int(15)
// ["minutes"]=>
// int(52)
// ["hours"]=>
// int(9)
// ["mday"]=>
// int(9)
// ["wday"]=>
// int(5)
// ["mon"]=>
// int(10)
// ["year"]=>
// int(2020)
// ["yday"]=>
// int(282)
// ["weekday"]=>
// string(6) "Friday"
// ["month"]=>
// string(7) "October"
// [0]=>
// int(1602204735)
// } var_dump(gettimeofday());
// array(4) {
// ["sec"]=>
// int(1602205147)
// ["usec"]=>
// int(625261)
// ["minuteswest"]=>
// int(-540)
// ["dsttime"]=>
// int(0)
// } var_dump(gettimeofday(true)); // float(1602205147.6253)

getdate() 函数只会返回日期时间的详细内容,没有错误信息之类的内容,不仅包括年、月、时、分等相关信息,还包含了当前时间的时间戳信息,可以说是真正的完整的日期详情函数。它可以有一个参数,用来返回指定日期的内容,如果不给这个参数,则返回的是当前日期时间下的信息。gettimeofday() 从名称就可以看出,它返回的是当前日期的时间戳信息,如果将它的参数设置为 true ,那么它和 time() 返回的内容基本是类似的,不过需要注意的是,它返回的内容是包含微秒的哦。后面我们将要看到的 microtime() 是专门用来返回带微秒的时间戳的函数,它也一样可以设置参数为 true 来返回这种数字格式的时间戳,不过大部分人可能都不知道呢。

获取本地时间详细信息

$localtime = localtime();
$localtime_assoc = localtime(time(), true);
print_r($localtime);
// Array
// (
// [0] => 14
// [1] => 3
// [2] => 10
// [3] => 9
// [4] => 9
// [5] => 120
// [6] => 5
// [7] => 282
// [8] => 0
// )
print_r($localtime_assoc);
// Array
// (
// [tm_sec] => 14
// [tm_min] => 3
// [tm_hour] => 10
// [tm_mday] => 9
// [tm_mon] => 9
// [tm_year] => 120
// [tm_wday] => 5
// [tm_yday] => 282
// [tm_isdst] => 0
// )

localtime() 函数返回的是本地时间的数组信息,它与 C 函数调用返回的完全一样,如果将第二个参数设置为 true 的话,返回的数组键就是英文的键名形式的内容。可以看出它也是返回的时间信息,同样地包含年、月、日、时、分、秒这些内容。另外还包括 wday 周中的第几天,yday 年中的第几天这些信息。

其它时间函数

var_dump(microtime()); // string(21) "0.38488800 1602205473"

var_dump(microtime(true)); // float(1602205473.3849)

这就是前面讲过的 microtime() 函数,在没有参数的情况下,它返回的内容是 微秒 空格 秒 这种格式的时间戳,加了参数以后就是返回的 秒 . 微秒 这样的格式。可以明显地看出,默认情况下它的微秒精度更高一些,当然,具体的需求还是要根据我们的业务情况来定夺到底使用哪种格式,其实如果说要拼接自己的时间戳格式的话,上面说过的 gettimeofday() 可能更方便一些,毕竟它返回的数组中已经为我们准备好了 sec 和 usec 这两个字段。这绝对是今天这篇文章最大的惊喜哦,完全可以应用到我们需要微秒单位的一些真实业务场景中。


var_dump(gmdate("Y-m-d H:i:s")); // string(19) "2020-10-09 01:00:20" var_dump(idate('Y')); // int(2020) var_dump(mktime(14, 22, 22, 10, 22, 2020)); // int(1603344142)
var_dump(gmmktime(14, 22, 22, 10, 22, 2020)); // int(1603376542) var_dump(strftime("%C %Y %m %d %R %U")); // string(22) "20 2020 10 09 10:12 40"
var_dump(gmstrftime("%C %Y %m %d %R %U")); // string(22) "20 2020 10 09 01:13 40" var_dump(strptime("2020-10-09 12:12:12", '%Y-%m-%d %H:%M:%S'));
// array(9) {
// ["tm_sec"]=>
// int(12)
// ["tm_min"]=>
// int(12)
// ["tm_hour"]=>
// int(12)
// ["tm_mday"]=>
// int(9)
// ["tm_mon"]=>
// int(9)
// ["tm_year"]=>
// int(120)
// ["tm_wday"]=>
// int(5)
// ["tm_yday"]=>
// int(282)
// ["unparsed"]=>
// string(0) ""
// }

gmdate() 获取的就是格里时间,也就是我们当前时区减少8小时的时区。idate() 函数用于获取指定的时间信息,比如我们在测试代码中只获取当前的年份。

mktime() 获取的是指定时间的时间戳,同理,gmmktime() 获取的就是指定时间的格里时间戳。

strftime() 和 gmstrftime() 获取的是格式化的本地时间日期,带 gm 开头的也是格里时间,后面跟的是需要的格式,这个和 DateTime 的 format() 方法是类似的,里面的参数也是类似的。%C 表示的是世纪,和我们真实对应的世纪需要加1,比如代码中返回的是 20 ,实际上我们现在是 21 世纪。%R 返回的是 H:i 这个格式,%U 返回的是第几周。

strptime() 是根据指定格式的日期返回日期的详细信息数组,和 localtime() 有点类似。

总结

是不是感觉又发现了很多宝藏,今天的学习中我们发现了 gettimeofday() 这个函数也可以返回微秒时间,而且还是数组格式化的,也发现了好玩的可以计算指定日期日出和日落时间的函数。当然,学习只是一方面,首先你要记得在 PHP 中已经提供了这些函数,然后再在实际的业务场景中进行应用,这样才能说是真正地熟练地掌握了这些内容,别的不多说了,赶紧用起来吧。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/1.PHP中的日期相关函数(三).php

参考文档:

https://www.php.net/manual/zh/ref.datetime.php

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

PHP中的日期相关函数(三)的更多相关文章

  1. PHP中的日期相关函数(二)

    上回文章中我们介绍了三个时间日期相关的对象,不过它们的出镜频率并不是特别地高.今天学习的对象虽说可能不少人使用过,但是它的出镜频率也是非常低的.它们其实就是我们非常常用的那些面向过程的日期函数的面向对 ...

  2. PHP中的日期相关函数(一)

    日期相关的操作函数是我们在日常的工作开发中最常接触到的功能.当然,大部分同学可能最多用到的就是 date() . time() 这两个函数,我们今天先不讲这两个函数,或许后面的文章也不太会讲它们,毕竟 ...

  3. 从零开始编写自己的C#框架(14)——T4模板在逻辑层中的应用(三)

    原本关于T4模板原想分5个章节详细解说的,不过因为最近比较忙,也不想将整个系列时间拉得太长,所以就将它们整合在一块了,可能会有很多细节没有讲到,希望大家自己对着代码与模板去研究. 本章代码量会比较大, ...

  4. 谈谈javascript中的日期Date对象

    一.日期对象  在javascript中并没有日期型的数据类型,但是提供了一个日期对象可以操作日期和时间.  日期对象的创建:  new Date();二.将日期对象转换为字符串  将日期对象转换为字 ...

  5. javascript中关于日期和时间的基础知识

    × 目录 [1]标准时间 [2]字符串 [3]闰年[4]月日[5]星期[6]时分秒 前面的话 在介绍Date对象之前,首先要先了解关于日期和时间的一些知识.比如,闰年.UTC等等.深入了解这些,有助于 ...

  6. 35 网络相关函数(三)——live555源码阅读(四)网络

    35 网络相关函数(三)——live555源码阅读(四)网络 35 网络相关函数(三)——live555源码阅读(四)网络 简介 5)NoReuse不重用地址类 6)initializeWinsock ...

  7. MYSQL中关于日期处理的函数

    < DOCTYPE HTML PUBLIC -WCDTD HTML TransitionalEN> MySQL数据库中SQL语句中 关于日期.时间\时间戳的函数   一 MySQL 获得当 ...

  8. Android中关于日期时间与时区的使用总结

    在开发Android的过程中,出现过几次由于日期时间导致的问题,而且主要是由于时区的原因导致,所以一直想总结一下,形成一个良好的开发规范.   一.Unix时间戳   Unix时间戳(Unix tim ...

  9. Java中的日期操作

    在日志中常用的记录当前时间及程序运行时长的方法: public void inject(Path urlDir) throws Exception { SimpleDateFormat sdf = n ...

随机推荐

  1. Configure Hosts with Puppet

    According to "Pro Puppet" 2nd edition, Chapter 2, "Creating a Module to Manage SSH&qu ...

  2. DVWA-全等级SQL注入(显注)

    前言: 首先是DVWA环境的搭建: 1.DVWA. 2.PHPSTUDY/WampServer,这里有一个坑,因为他是一体化的,PHP版本必须在5.4以上,否则显注不能打开.或者自己搭建LAMP环境. ...

  3. E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

    E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)E: Unable to l ...

  4. Xilinx约束学习笔记(二)—— 定义时钟

    2. 定义时钟 2.1 关于时钟 为了获得最佳精度路径覆盖信息,必须正确定义时钟. 时钟要定义在时钟树的根 pin 或 port 上,称为 source point. 时钟的边缘应该由周期和波形进行组 ...

  5. COM笔记-类厂

    CoCreateInstance实际上并没有直接创建COM组件 ,而是创建了一个被称作是类厂的组件.而所需的组件正是由些类厂创建的.类厂组件的唯一功能就创建其他的组件.创建组件的标准接口是IClass ...

  6. 【springboot】整合 MyBatis

    转自:https://blog.csdn.net/cp026la/article/details/86493503 1. 简介: 目前,国内大部分公司都使用 MyBatis作为持久层框架.本章整合My ...

  7. prism 中的 自定义region

    参考网址: https://blog.csdn.net/weixin_30872499/article/details/98673059 并不是所有控件都可以被用作Region了吗?我们将Gird块的 ...

  8. dataTemplate 的使用之listView

    <Window x:Class="WpfApplication1.Window39" xmlns="http://schemas.microsoft.com/win ...

  9. nodejs根据word模板生成文档(方法二)

    [推荐该方法,模板比较简洁] 1,代码, 这里采用的模块为 docxtemplater 和 open-docxtemplater-image-module,均为开源(docxtemplater 有收费 ...

  10. redis并发锁

    1.应对并发场景 避免操作数据不一致 将对redis加锁 2.考虑到异常状况无法释放锁,导致死锁 将代码块进行try-catch处理 3.考虑try时宕机依然导致死锁 对锁添加时效性,添加过期时间 4 ...