PHP中的日期相关函数(三)
之前我们已经介绍过了 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
各自媒体平台均可搜索【硬核项目经理】