之前我们已经介绍过了 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. 能够进行多段文本匹配的NFA改良算法

    下面的代码基于NFA算法实现了在多段字符串中匹配正则表达式,对比NFA算法可以看到它将pc由局部变量提升为类成员,以保存中间匹配状态,另外在匹配成功后将pc恢复到null状态.实际使用中,此类还应该增 ...

  2. STP生成树的一些笔记

    一.STP概述 1.1.STP简介 交换网络环路主要由广播风暴.多帧复制和MAC地址表紊乱造成. 广播风暴:一个数据帧或包被传输到本地网段 (由广播域定义)上的每个节点就是广播:由于网络拓扑的设计和连 ...

  3. Golang语言系列-11-goroutine并发

    goroutine 并发 概念 package main import ( "fmt" "time" ) /* [Go语言中的并发编程 goroutine] [ ...

  4. HCNA Routing&Switching之地址转换技术NAT

    前文我们了解了包过滤工具ACL相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15156308.html:今天我们来聊一聊地址转换技术NAT相关话题: ...

  5. 08-SpringCloud Consul

    Consul简介 官网 Consul下载地址 What is Consul? Consul is a service mesh solution providing a full featured c ...

  6. 3 分钟了解 JSON Schema

    大家好,我不是鱼皮. 幸运又不幸,我是一名程序员,他也是一名程序员. 周末,我在开发网站,他在开发游戏,两个人一起写代码,一起写 Bug 头秃,竟也有了一丝别样的浪漫,好不自在! 今天,他遇到了一个后 ...

  7. ASP.NET Core:ASP.NET Core程序使用Docker部署

    一.前言 这篇文章介绍如何将一个ASP.NET Core应用程序在Docker中进行部署.开发工具使用的是Visual Studio 2019和VS Code. 二.使用Docker部署 我们选择新建 ...

  8. 在C++中使用openmp进行多线程编程

    在C++中使用openmp进行多线程编程 一.前言 多线程在实际的编程中的重要性不言而喻.对于C++而言,当我们需要使用多线程时,可以使用boost::thread库或者自从C++ 11开始支持的st ...

  9. 常用cron表达式

    0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时 0 0 12 ? * WED 表示每个星期三中午12点 " ...

  10. python常用工具库介绍

    Numpy:科学计算 HOME:  http://www.numpy.org/ NumPy is the fundamental package for scientific computing wi ...