PHP的时间函数

引入

好久没有更新公众号了。今天稍有空闲,突然翻到之前项目代码中关于时间计算的代码。加之最近有同学问我,怎么把项目中最近一个星期,或最近一个月的订单导出来啊。所以就稍稍整理了一下PHP中最常用的时间相关的函数和场景。

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

日期相关

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

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

echo "获取当前时间:" . date('Y-m-d H:i:s'), '

';

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

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

echo "星期几(英文全称):" . date('l'), '

';

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

echo "星期几(英文缩写):" . date('D'), '

';

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

echo "星期几(数字表示):" . date('w'), '

';

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

echo "月份(英文全称):" . date('F'), '

';

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

echo "月份(英文缩写):" . date('M'), '

';

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

echo "月份(数字表示):" . date('m'), '

';

// Asia/Shanghai

echo "时区:" . date('e'), '

';

// CST China Standard Time

echo "本地时区:" . date('T'), '

';

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

echo "一年中的第几天(0-365):" . date('z'), '

';

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

echo "一年中的第几周(1-54):" . date('W'), '

';

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

echo "固定小时:" . date('Y-m-d 12:i:s'), '

';

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

echo "固定分钟:" . date('Y-m-d H:00:s'), '

';

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

echo "固定秒数:" . date('Y-m-d H:i:00'), '

';

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

获取当前时间

获取星期几,因为周一到周五与周六日的业务逻辑可能不同,所以要区分

时间粒度划分。获取一年中第几天或第几周,甚至对获取月份进行简单封装后,还能获取一年中的季度数,例如1,2,3月是第一季度。这些时间数据对于统计,计划任务等可能有用。例如:银行的计息,可能按照月度,季度或年来分别执行。

固定时间在需要固定计数的场景下用的比较多,例如:拍卖,可能是下午5点钟01分正式开拍,所以这是需要将时间固定好;或者是计划任务执行,时间不到进程就先睡一会儿,时间到了再执行。

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

时间戳相关

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

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

echo "当前时间戳(以秒为单位):" . time(), '

';

function mtime()

{

list($msec, $sec) = explode(" ", microtime());

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

}

echo "当前时间戳(以毫秒为单位):" . number_format(mtime(), 0, '', ''), '

';

function utime()

{

list($usec, $sec) = explode(" ", microtime());

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

}

echo "当前时间戳(以微妙秒为单位):" . number_format(utime(), 0, '', ''), '

';

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

普通的创建时间,日志记录等用以秒为单位的时间戳就够了

而在“秒杀”或“竞拍”这种高可用场景下可能就需要毫秒计时了;

而在消息队列或密集计算等场景下,就可能需要根据微妙排序了

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

时间范围相关

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

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

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

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

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

echo '当前时间:' . date('Y-m-d') . '

';

// 上周: 2018-08-25

echo '上周: ' . date('Y-m-d', $nextWeek) . '

';

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

// 上周: 2018-08-25

echo '上周: ' . date('Y-m-d', strtotime('-1 week')) . '

';

// 上个月: 2018-08-01

echo '上个月: ' . date('Y-m-d', strtotime('-1 month')) . '

';

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

echo '前三个月: ' . date('Y-m-d', strtotime('-3 month')) . '

';

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

// 下周: 2018-09-08

echo '下周: ' . date('Y-m-d', strtotime('+1 week')) . '

';

// 下周四: 2018-09-06

echo '下周四: ' . date('Y-m-d', strtotime('next Thursday')) . '

';

// 下周又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')) . '

';

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

统计。例如统计一下过去一个月一共有多少订单。可能的SQL语句是这样

SELECT count(*) FROM order WHERE created >上个月的时间戳

预定。例如预定宾馆(未来的时间段)或者买票(未来的时间点)

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

PHP大象公馆

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180901G19P7S00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券