如何在 PHP 中获取当前时间(以毫秒为单位)?
time()
以秒为单位 - 有没有以毫秒为单位的?
time()
is in seconds - is there one in milliseconds?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
time()
以秒为单位 - 有没有以毫秒为单位的?
time()
is in seconds - is there one in milliseconds?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(17)
使用
microtime
。该函数返回一个以空格分隔的字符串。第一部分是秒的小数部分,第二部分是整数部分。传入true
以获取数字:如果使用
microtime(true)
,请注意精度损失。还有
gettimeofday
返回微秒部分作为整数。Use
microtime
. This function returns a string separated by a space. The first part is the fractional part of seconds, the second part is the integral part. Pass intrue
to get as a number:Beware of precision loss if you use
microtime(true)
.There is also
gettimeofday
that returns the microseconds part as an integer.简短回答:
仅限 64 位平台!
[如果您运行 64 位 PHP,则常量
PHP_INT_SIZE
等于8
> ]长答案:
如果您首先想要一个以毫秒为单位的
time()
等效函数,您必须考虑到time()
返回自“纪元时间”(01/01/1970),毫秒数,因为“纪元时间”是一个很大的数字,不适合 32 位整数。PHP 中整数的大小可以是 32 位或 64 位,具体取决于平台。
来自 http://php.net/manual/en/language.types.integer。 php
如果您有 64 位整数,那么您可以使用以下函数:
microtime()
返回自“纪元时间”以来的秒数,精度高达微秒,两个数字以空格分隔,例如.. 第二个数字是秒(整数),第一个数字是小数部分。
上面的函数
milliseconds()
将整数部分乘以1000
,然后加上小数部分乘以
1000
并四舍五入到 0 位小数请注意,两者
$mt[1]
和round
的结果通过intval()
转换为int
。这是必要的,因为它们是浮点型,并且在不进行强制转换的情况下对它们进行操作将导致函数返回一个精度有所损失的浮点型。函数稍微精确一些,
最后,该函数比比例为 1:10(大约)的 返回的结果比正确结果多 1 毫秒。
这是由于 float 类型的精度有限(
microtime(true)
返回 float)。无论如何,如果您仍然喜欢较短的 round(microtime(true)*1000); ,我建议将结果转换为 int 。
即使它超出了问题的范围,值得一提的是,如果您的平台支持 64 位整数,那么您也可以获取以微秒为单位的当前时间,而不会导致溢出。
如果事实
2^63 - 1
(最大的有符号整数)除以10^6 * 3600 * 24 * 365
(大约一年中的微秒数)得到292471
。这与您获得的值相同
。换句话说,有符号的 64 位整数有空间存储超过 200,000 年的时间跨度(以微秒为单位)。
那么你可能有
Short answer:
64 bits platforms only!
[ If you are running 64 bits PHP then the constant
PHP_INT_SIZE
equals to8
]Long answer:
If you want an equilvalent function of
time()
in milliseconds first you have to consider that astime()
returns the number of seconds elapsed since the "epoch time" (01/01/1970), the number of milliseconds since the "epoch time" is a big number and doesn't fit into a 32 bits integer.The size of an integer in PHP can be 32 or 64 bits depending on platform.
From http://php.net/manual/en/language.types.integer.php
If you have 64 bits integers then you may use the following function:
microtime()
returns the number of seconds since the "epoch time" with precision up to microseconds with two numbers separated by space, like...The second number is the seconds (integer) while the first one is the decimal part.
The above function
milliseconds()
takes the integer part multiplied by1000
then adds the decimal part multiplied by
1000
and rounded to 0 decimalsNote that both
$mt[1]
and the result ofround
are casted toint
viaintval()
. This is necessary because they arefloat
s and the operation on them without casting would result in the function returning afloat
with a loss in precision.Finally, that function is slightly more precise than
that with a ratio of 1:10 (approx.) returns 1 more millisecond than the correct result.
This is due to the limited precision of the float type (
microtime(true)
returns a float).Anyway if you still prefer the shorter
round(microtime(true)*1000);
I would suggest casting toint
the result.Even if it's beyond the scope of the question it's worth mentioning that if your platform supports 64 bits integers then you can also get the current time in microseconds without incurring in overflow.
If fact
2^63 - 1
(biggest signed integer) divided by10^6 * 3600 * 24 * 365
(approximately the microseconds in one year) gives292471
.That's the same value you get with
In other words, a signed 64 bits integer have room to store a timespan of over 200,000 years measured in microseconds.
You may have then
正如其他人所说,您可以使用
microtime()
来获取时间戳的毫秒精度。从您的评论来看,您似乎希望将其作为高精度 UNIX 时间戳。类似于 .NET 世界中的
DateTime.Now.Ticks
。您可以使用以下函数来执行此操作:
As other have stated, you can use
microtime()
to get millisecond precision on timestamps.From your comments, you seem to want it as a high-precision UNIX Timestamp. Something like
DateTime.Now.Ticks
in the .NET world.You may use the following function to do so:
字符串变体的最短版本(32 位兼容):
Shortest version of string variant (32-bit compatibile):
echo date('Ymd H:i:s.') 。 gettimeofday()['usec'];
输出:
2016-11-19 15:12:34.346351
echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];
output:
2016-11-19 15:12:34.346351
在 PHP 5 中使用
microtime(true)
,或者PHP 4 中的以下修改:编写该代码的可移植方法是:
Use
microtime(true)
in PHP 5, or the following modification in PHP 4:A portable way to write that code would be:
即使您使用的是 32 位 PHP,这也适用:
请注意,这不会为您提供整数,而是字符串。然而,这在许多情况下都可以正常工作,例如为 REST 请求构建 URL 时。
如果您需要整数,则必须使用 64 位 PHP。
然后你可以重用上面的代码并转换为 (int):
或者你可以使用好的单行代码:
This works even if you are on 32-bit PHP:
Note this doesn't give you integers, but strings. However this works fine in many cases, for example when building URLs for REST requests.
If you need integers, 64-bit PHP is mandatory.
Then you can reuse the above code and cast to (int):
Or you can use the good ol' one-liners:
PHP 5.2.2 <
PHP 7.0.0 < 7.1
PHP 5.2.2 <
PHP 7.0.0 < 7.1
试试这个:
try this:
希望这对您有帮助。
Hope this help you.
这是我的实现,应该也可以在 32 位上运行。
This is my implementation, should work on 32bit as well.
如果您想查看真实的微秒,则需要将 php.ini 中的精度设置更改为 16。
之后,微秒(true) > 给了我
1631882476.298437
的输出。所以我认为我需要将余数(
298437
)除以1000,但实际上,余数是a的0.298437
第二。所以我需要乘以 1000 才能得到正确的结果。If you want to see real microseconds, you will need to change the
precision
setting inphp.ini
to 16.After that,
microsecond(true)
gave me the output of1631882476.298437
.So I thought that I need to divide the remainder (
298437
) with 1000, but in fact, the remainder is0.298437
of a second. So I need to multiply that by 1000 to get the correct result.我个人使用这个:
I personaly use this:
当获取毫秒时,我们期望看到
3
数字:这本质上是 JavaScript 中实现的类似:
When getting milliseconds we expect to see
3
digits:which is essentially an analogue of the implementation in JavaScript:
使用这个:
再见
Use this:
Bye
简短的回答是:
The short answer is: