Time()是以秒为单位的——有以毫秒为单位的吗?
当前回答
简短的回答:
仅限64位平台!
function milliseconds() {
$mt = explode(' ', microtime());
return intval( $mt[1] * 1E3 ) + intval( round( $mt[0] * 1E3 ) );
}
[如果你运行64位PHP,常量PHP_INT_SIZE等于8]
长一点的回答:
如果你想要一个以毫秒为单位的等价的time()函数,首先你必须考虑到time()返回的是从“epoch time”(01/01/1970)开始经过的秒数,从“epoch time”开始的毫秒数是一个很大的数字,不适合32位整数。
在PHP中,整数的大小可以是32位或64位,这取决于平台。
从http://php.net/manual/en/language.types.integer.php
整数的大小取决于平台,尽管通常的最大值约为20亿(有32位符号)。64位平台通常有大约9E18的最大值,除了Windows,它总是32位。PHP不支持无符号整数。从PHP 4.4.0和PHP 5.0.5开始,可以使用常量PHP_INT_SIZE确定整数大小,使用常量PHP_INT_MAX确定最大值。
如果你有64位整数,那么你可以使用下面的函数:
function milliseconds() {
$mt = explode(' ', microtime());
return intval( $mt[1] * 1E3 ) + intval( round( $mt[0] * 1E3 ) );
}
Microtime()返回自“纪元时间”以来的秒数,精度可达微秒,其中两个数字由空格分隔,如…
0.90441300 1409263371
第二个数字是秒数(整数),第一个数字是小数部分。
上面的函数milliseconds()取整数部分乘以1000
1409263371000
然后将小数部分乘以1000,四舍五入为0小数
1409263371904
注意$mt[1]和round的结果都通过intval()转换为int。这是必要的,因为它们是浮点数,对它们进行不强制转换的操作将导致函数返回一个精度损失的浮点数。
最后,该函数比
round(microtime(true)*1000);
比例为1:10(大约)的结果比正确结果多返回1毫秒。 这是由于浮点数类型的精度有限(microtime(true)返回一个浮点数)。 无论如何,如果你仍然喜欢更短的回合(微时间(正确)*1000);我建议将结果类型转换为int类型。
即使这超出了问题的范围,值得一提的是,如果您的平台支持64位整数,那么您也可以获得以微秒为单位的当前时间,而不会引起溢出。
如果2^63 - 1(最大的有符号整数)除以10^6 * 3600 * 24 * 365(大约一年的微秒)得到292471。
这和你得到的值是一样的
echo intdiv( PHP_INT_MAX, 1E6 * 3600 * 24 * 365 );
换句话说,一个有符号的64位整数有空间存储超过20万年的时间跨度(以微秒计)。
那你就可以
function microseconds() {
$mt = explode(' ', microtime());
return intval( $mt[1] * 1E6 ) + intval( round( $mt[0] * 1E6 ) );
}
其他回答
我个人使用这个:
public static function formatMicrotimestamp(DateTimeInterface $dateTime): int
{
return (int) substr($dateTime->format('Uu'), 0, 13);
}
简短的回答:
仅限64位平台!
function milliseconds() {
$mt = explode(' ', microtime());
return intval( $mt[1] * 1E3 ) + intval( round( $mt[0] * 1E3 ) );
}
[如果你运行64位PHP,常量PHP_INT_SIZE等于8]
长一点的回答:
如果你想要一个以毫秒为单位的等价的time()函数,首先你必须考虑到time()返回的是从“epoch time”(01/01/1970)开始经过的秒数,从“epoch time”开始的毫秒数是一个很大的数字,不适合32位整数。
在PHP中,整数的大小可以是32位或64位,这取决于平台。
从http://php.net/manual/en/language.types.integer.php
整数的大小取决于平台,尽管通常的最大值约为20亿(有32位符号)。64位平台通常有大约9E18的最大值,除了Windows,它总是32位。PHP不支持无符号整数。从PHP 4.4.0和PHP 5.0.5开始,可以使用常量PHP_INT_SIZE确定整数大小,使用常量PHP_INT_MAX确定最大值。
如果你有64位整数,那么你可以使用下面的函数:
function milliseconds() {
$mt = explode(' ', microtime());
return intval( $mt[1] * 1E3 ) + intval( round( $mt[0] * 1E3 ) );
}
Microtime()返回自“纪元时间”以来的秒数,精度可达微秒,其中两个数字由空格分隔,如…
0.90441300 1409263371
第二个数字是秒数(整数),第一个数字是小数部分。
上面的函数milliseconds()取整数部分乘以1000
1409263371000
然后将小数部分乘以1000,四舍五入为0小数
1409263371904
注意$mt[1]和round的结果都通过intval()转换为int。这是必要的,因为它们是浮点数,对它们进行不强制转换的操作将导致函数返回一个精度损失的浮点数。
最后,该函数比
round(microtime(true)*1000);
比例为1:10(大约)的结果比正确结果多返回1毫秒。 这是由于浮点数类型的精度有限(microtime(true)返回一个浮点数)。 无论如何,如果你仍然喜欢更短的回合(微时间(正确)*1000);我建议将结果类型转换为int类型。
即使这超出了问题的范围,值得一提的是,如果您的平台支持64位整数,那么您也可以获得以微秒为单位的当前时间,而不会引起溢出。
如果2^63 - 1(最大的有符号整数)除以10^6 * 3600 * 24 * 365(大约一年的微秒)得到292471。
这和你得到的值是一样的
echo intdiv( PHP_INT_MAX, 1E6 * 3600 * 24 * 365 );
换句话说,一个有符号的64位整数有空间存储超过20万年的时间跨度(以微秒计)。
那你就可以
function microseconds() {
$mt = explode(' ', microtime());
return intval( $mt[1] * 1E6 ) + intval( round( $mt[0] * 1E6 ) );
}
$the_date_time = new DateTime($date_string);
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) +
($the_date_time->format('u') / 1000);
简单的回答是:
$milliseconds = floor(microtime(true) * 1000);
正如其他人所述,您可以使用microtime()在时间戳上获得毫秒精度。
从您的评论来看,您似乎希望它是一个高精度的UNIX时间戳。类似于。net世界中的DateTime.Now.Ticks。
你可以使用以下函数来完成:
function millitime() {
$microtime = microtime();
$comps = explode(' ', $microtime);
// Note: Using a string here to prevent loss of precision
// in case of "overflow" (PHP converts it to a double)
return sprintf('%d%03d', $comps[1], $comps[0] * 1000);
}
推荐文章
- 编写器更新和安装之间有什么区别?
- 如何计算两个时间串之间的时间间隔
- 本地机器上的PHP服务器?
- 如何评论laravel .env文件?
- 在PHP中检测移动设备的最简单方法
- 如何精确地以毫秒为单位记录方法的执行时间?
- 如何在树枝模板中呈现DateTime对象
- 如何删除查询字符串,只得到URL?
- 您是否可以“编译”PHP代码并上传一个二进制文件,该文件将由字节码解释器运行?
- Ruby中DateTime和Time的区别
- 非法字符串偏移警告PHP
- 从数组中获取随机项
- 为什么一个函数检查字符串是否为空总是返回true?
- 如何使用Laravel迁移将时间戳列的默认值设置为当前时间戳?
- 如何增加php的最大执行时间