之前我们已经介绍过了 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. 文件上传 安鸾 Writeup

    目录 Nginx解析漏洞 文件上传 01 文件上传 02 可以先学习一下文件上传相关漏洞文章: https://www.geekby.site/2021/01/文件上传漏洞/ https://xz.a ...

  2. S3C2440—3.用点亮LED来熟悉裸机开发的详细流程

    文章目录 一.硬件知识 1.LED原理图 2.芯片手册 Ⅰ.找LED原理图 Ⅱ.找对应引脚 Ⅲ.在芯片手册中查找引脚信息 Ⅳ.查看寄存器说明 Ⅴ.配置寄存器 二.S3C2440框架与启动过程 三.要用 ...

  3. 搭建riscv环境

    1.第一步 clone 需要的源文件(sudo apt install git   如果你没有git)  以下都是给予ubuntu18.04 $ git clone --recursive https ...

  4. stm32高级定时器1互补输出 验证代码

    GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDe ...

  5. Python爬虫(二)——发送请求

    1. requests库介绍 ​ 在python中有许多支持发送的库.比如:urlib.requests.selenium.aiohttp--等.但我们当前最常用的还是requests库,这个库是基于 ...

  6. 【mysql】索引优化分析

    1. 索引的概念 1.1 索引是什么 MySQL 官方对索引的定义为:索引(Index)是帮助MySQL 高效获取数据的数据结构.可以得到索引的本质:索引是数据结构.可以简单理解为排好序的快速查找数据 ...

  7. 【nodejs】request 和 response 对象

    request 和 response 对象的具体介绍: Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性.常见属性有: req ...

  8. HDFS Shell基本操作

    1.目录操作 hdfs dfs [命令]  [命令]         等价于            hadoop fs []  [] 1  ./bin/hdfs dfs -mkdir -p /user ...

  9. ProjectEuler 009题

    题目: A Pythagorean triplet is a set of three natural numbers, a b c, for which, a2 + b2 = c2 For exam ...

  10. 多线程Synchronized的两种锁

    Synchronized的作用: 能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果 Synchronized的两个用法: 1)对象锁 包括方法锁(默认锁对象为this当前实例对 ...