共计 5201 个字符,预计需要花费 14 分钟才能阅读完成。
之前咱们曾经介绍过了 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
各自媒体平台均可搜寻【硬核项目经理】