您的位置 首页 php

PHP的时间函数

PHP中时间相关的函数还是挺多的,本文只整理四个最常用的。分别是date(), time(), microtime()和strtotime()。每个函数的具体语法,大家可以自行翻手册,这里不再赘述,这里会按照下面三个主题进行讨论。

日期相关

日期相关主要指的是date()函数,date()函数中有很多格式字符,你可以根据需要,自行选择合适的日期格式输出。可能PHP工程师最熟悉的就是下面的代码:

// 获取当前时间:2018-09-01 18:15:56

echo “获取当前时间:” . date(‘Y-m-d H:i:s’), ‘<br>’;

而我想要强调的是大家不太熟悉,但又很有用的格式字符。例如:

// 星期几(英文全称):Saturday

echo “星期几(英文全称):” . date(‘l’), ‘<br>’;

// 星期几(英文全称):Sat

echo “星期几(英文缩写):” . date(‘D’), ‘<br>’;

// 星期几(英文全称):6

echo “星期几(数字表示):” . date(‘w’), ‘<br>’;

// 月份(英文全称):September

echo “月份(英文全称):” . date(‘F’), ‘<br>’;

// 月份(英文全称):Sep

echo “月份(英文缩写):” . date(‘M’), ‘<br>’;

// 月份(英文全称):09

echo “月份(数字表示):” . date(‘m’), ‘<br>’;

// Asia/Shanghai

echo “时区:” . date(‘e’), ‘<br>’;

// CST China Standard Time

echo “本地时区:” . date(‘T’), ‘<br>’;

// 一年中的第几天(0-365):243

echo “一年中的第几天(0-365):” . date(‘z’), ‘<br>’;

// 一年中的第几周(1-54):35

echo “一年中的第几周(1-54):” . date(‘W’), ‘<br>’;

// 固定小时:2018-09-01 12:15:56

echo “固定小时:” . date(‘Y-m-d 12:i:s’), ‘<br>’;

固定分钟:2018-09-01 18:00:56

echo “固定分钟:” . date(‘Y-m-d H:00:s’), ‘<br>’;

// 固定秒数:2018-09-01 18:15:00

echo “固定秒数:” . date(‘Y-m-d H:i:00’), ‘<br>’;

以上代码可能的应用场景有:

  • 获取当前时间
  • 获取星期几,因为周一到周五与周六日的业务逻辑可能不同,所以要区分
  • 时间粒度划分。获取一年中第几天或第几周,甚至对获取月份进行简单封装后,还能获取一年中的季度数,例如1,2,3月是第一季度。这些时间数据对于统计,计划任务等可能有用。例如:银行的计息,可能按照月度,季度或年来分别执行。
  • 固定时间在需要固定计数的场景下用的比较多,例如:拍卖,可能是下午5点钟01分正式开拍,所以这是需要将时间固定好;或者是计划任务执行,时间不到进程就先睡一会儿,时间到了再执行。

以上还有很多应用场景,大家可以自行对号入座。

时间戳相关

有的时候我们可以需要时间戳。例如:保存时间是用时间戳要比日期时间格式占用空间更小;计算时间时也更方便。下面我按照“秒”,“毫秒”(1秒=1000毫秒(ms

)和“微妙”(1秒=1 000 000 微秒(μs) )三个单位来分别获取:

// echo 当前时间戳(以秒为单位):1535796956

echo “当前时间戳(以秒为单位):” . time(), ‘<br>’;

// 当前时间戳(以毫秒为单位):1535796956 916

function mtime()

{

list($msec, $sec) = explode (” “, microtime());

return ceil(((float) $msec + (float) $sec) * 1000);

}

echo “当前时间戳(以毫秒为单位):” . number_format(mtime(), 0, ”, ”), ‘<br>’;

// 当前时间戳(以微妙秒为单位):1535796956 916023

function utime()

{

list($usec, $sec) = explode(” “, microtime());

return ceil(((float) $usec + (float) $sec) * 1000000);

}

echo “当前时间戳(以微妙秒为单位):” . number_format(utime(), 0, ”, ”), ‘<br>’;

PHP中time()可以直接返回以秒为单位的时间戳,而microtime()返回的结果则包含小数秒部分。以上分别获取了秒,毫秒和微妙为单位的时间戳,其中的毫秒获取,类似JS中的getMilliseconds()。在应用时,要根据不同的时间粒度来选择,例如:

  • 普通的创建时间,日志记录等用以秒为单位的时间戳就够了
  • 而在“秒杀”或“竞拍”这种高可用场景下可能就需要毫秒计时了;
  • 而在消息队列或密集计算等场景下,就可能需要根据微妙排序了

以上代码中我对取到的结果进行了向上取整(ceil()),如果业务中需要向下取整,可自行调节。

时间范围相关

最后,回答一下刚开始提到的问题。如果我有一张订单表(order)。那么,我如果将过去一周,或过去三个月的订单做统计呢(例如:统计订单数或销售额)。

首先我们来看一个逻辑最简单的实现:

// 在当前时间戳的基础上减去7天的秒数,获取的就是7天前的时间

$nextWeek = time() – (7 * 24 * 60 * 60);

// 当前时间:2018-09-01

echo ‘当前时间:’ . date(‘Y-m-d’) . ‘<br>’;

// 上周: 2018-08-25

echo ‘上周: ‘ . date(‘Y-m-d’, $nextWeek) . ‘<br>’;

另外还可以通过strtotime()来实现,起始更简单

// 上周: 2018-08-25

echo ‘上周: ‘ . date(‘Y-m-d’, strtotime(‘-1 week’)) . ‘<br>’;

// 上个月: 2018-08-01

echo ‘上个月: ‘ . date(‘Y-m-d’, strtotime(‘-1 month’)) . ‘<br>’;

// 前三个月: 2018-06-01

echo ‘前三个月: ‘ . date(‘Y-m-d’, strtotime(‘-3 month’)) . ‘<br>’;

上面两个例子都是获取过去的时间,另外,还可以获取未来的时间,例如:

// 下周: 2018-09-08

echo ‘下周: ‘ . date(‘Y-m-d’, strtotime(‘+1 week’)) . ‘<br>’;

// 下周四: 2018-09-06

echo ‘下周四: ‘ . date(‘Y-m-d’, strtotime(‘next Thursday’)) . ‘<br>’;

// 下周又2天又4小时又2秒: 2018-09-10 22:15:58

echo ‘下周又2天又4小时又2秒: ‘ . date(‘Y-m-d H:i:s’, strtotime(‘+1 week 2 days 4 hours 2 seconds’)) . ‘<br>’;

以上代码对时间的处理实际上可以分为两类: 过去的时间 将来的时间 。而这两类分别对应下面的两种主要的应用场景:

  • 统计。例如统计一下过去一个月一共有多少订单。可能的SQL语句是这样
  • SELECT count(*) FROM order WHERE created > 上个月的时间戳
  • 预定。例如预定宾馆(未来的时间段)或者买票(未来的时间点)

以上就是今天的内容了,下次再见!

文章来源:智云一二三科技

文章标题:PHP的时间函数

文章地址:https://www.zhihuclub.com/77563.shtml

关于作者: 智云科技

热门文章

网站地图