最近在做一个智能家居项目的后台,需要实时上传用户对智能设备的配置信息到服务器,以便实现同步,因此对于时间的精确度要求比较高,最开始直接是用php的time()函数来获取时间戳,获取的时间精确到秒级别,如果客户端同时操作的话还是有可能产生冲突,因此建议将时间戳精度提高到毫秒级别,但是在php没有自带的函数能获取毫秒时间戳,但提供了一个microtime()函数,如果调用时不带可选参数,本函数以 "msec sec" 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00:00 January 1, 1970 GMT)起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。
microtime()函数的详细说明,可以到w3chool上面看看《PHP microtime() 函数》。
<?php
echo microtime();
//输出结果是
//0.25139300 1138197510
注意了,它的结果是分两部分的,也就是前半部分是毫秒(但是单位是秒),后半部分是秒。
现在,我们依据这个做下修改,如下:
<?php
list($msec, $sec) = explode(' ', microtime());
$msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
这样就可以了,$msectime就是当前的毫秒数!可以将这两行封装成一个函数方便使用。
<?php
//返回当前的毫秒时间戳
function msectime() {
list($msec, $sec) = explode(' ', microtime());
$msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
return $msectime;
}
注意:sprintf('%.0f', $num) 是输出不含小数部分的浮点数
事情还没有结束,我把时间戳改成毫秒级别后,再次更新数据库数据时,却提示超出范围,原来之前我在数据库中是用int型来存储time()函数获取的秒级别的时间戳,存储范围是够的,改成毫秒级别的,就得改成BIGINT类型了。
整数类型 字节 范围(有符号) 范围(无符号) 用途
TINYINT 1字节 (-128,127) (0,255) 小整数值
SMALLINT 2字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
来自 https://www.cnblogs.com/opensmarty/p/11377624.html
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
文实例讲述了PHP实现获取毫秒时间戳的方法。分享给大家供大家参考,具体如下:
PHP获取毫秒时间戳,利用microtime()
函数
php本身没有提供返回毫秒数的函数,但提供了一个microtime()
函数,借助此函数,可以很容易定义一个返回毫秒数的函数。
php的毫秒是没有默认函数的,但提供了一个microtime()
函数,该函数返回包含两个元素,一个是秒数,一个是小数表示的毫秒数,借助此函数,可以很容易定义一个返回毫秒数的函数,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | function getMillisecond() {
list( $s1 , $s2 ) = explode ( ' ' , microtime());
return (float)sprintf( '%.0f' , ( floatval ( $s1 ) + floatval ( $s2 )) * 1000);
}
function get_subtraction()
{
$t1 = microtime(true);
$t2 = microtime(true);
return (( $t2 - $t1 )*1000). 'ms' ;
}
function get_millisecond()
{
list( $usec , $sec ) = explode ( " " , microtime());
$msec = round ( $usec *1000);
return $msec ;
}
function get_total_millisecond()
{
$time = explode ( " " , microtime () );
$time = $time [1] . ( $time [0] * 1000);
$time2 = explode ( "." , $time );
$time = $time2 [0];
return $time ;
}
function microtime_float()
{
list( $usec , $sec ) = explode ( " " , microtime());
return ((float) $usec + (float) $sec );
}
$millisecond = get_millisecond();
$millisecond = str_pad ( $millisecond ,3, '0' ,STR_PAD_RIGHT);
echo date ( "YmdHis" ). $millisecond ;
|
运行结果:
20190301013407194
需要注意,在32位系统中php的int最大值远远小于毫秒数,所以不能使用int类型,而php中没有long类型,所以只好使用浮点数来表示。由于使用了浮点数,如果精度设置不对,使用echo显示获取的结果时可能会不正确,要想看到输出正确的结果,精度设置不能低于13位。
来自 https://www.jb51.net/article/157142.htm