在PHP5和Actionscript3中获取毫秒级Unix时间戳

28

在Actionscript中,可以通过以下方式获取以毫秒为单位的Unix时间戳:

public static function getTimeStamp():uint
        {
            var now:Date = new Date();
            return now.getTime();
        }

文档清楚地说明了以下内容:

getTime():Number 返回一个Date对象表示的自1970年1月1日午夜以来的毫秒数,世界协调时间(UTC)。

当我进行跟踪时,它返回以下内容:

824655597

所以,824655597 / 1000 / 60 / 60 / 24 / 365 = 0.02年。 显然这是不正确的,因为应该在39岁左右。

问题#1:这里有什么问题?

现在,进入PHP部分:我也想在那里获取毫秒级的时间戳。 microtime() 函数根据给定的参数返回字符串(0.29207800 1246365903)或浮点数(1246365134.01)。因为我认为时间戳很简单,我打算自己来做。但是现在我尝试并注意到这个浮点数,再加上我在Actionscript中的问题,我真的一无所知。

问题#2:如何使其返回Unix时间戳中的毫秒数?

时间戳应该很容易,我可能漏掉了什么.. 对此很抱歉。先提前感谢你。

编辑1:我自己回答了第一个问题。请参见下文。
编辑2:我也自己回答了第二个问题。请参见下文。48小时内无法接受答案。

12个回答

18

我在函数的返回类型中使用了无符号整数。这应该是Number。

public static function getTimeStamp():Number
        {
            var now:Date = new Date();
            return now.getTime();
        }

我想我现在已经掌握了在PHP5中获取毫秒的函数。

function msTimeStamp() {
    return round(microtime(1) * 1000);
}

4
两者都是正确的,但为了自己和他人着想,请将其更改为 PHP 中的 microtime(true)。当然,1 也可以使用,但参数应该是布尔值,仅仅因为语义上更加清晰易懂。这样真的更好阅读,无论是为了他人还是为了几年后的自己。 :) - back2dos
1
请更改为microtime(true)。 - Luis Cabrera Benito

16

对于ActionScript 3,可以使用new Date().getTime()


在PHP中,您可以简单地调用time()以获取自1970年1月1日00:00:00 GMT以来经过的时间(秒)。如果你想要毫秒,只需执行 (time()*1000)

如果使用 microtime()函数,将第二个参数乘以1000即可获得毫秒。将第一个参数乘以1000并四舍五入以获得毫秒,然后将两个数字相加。大功告成。


19
time()*1000会返回以零结尾的三位数吗? - Tom
3
是的,它会。使用time()函数可以精确到秒。如果您确实需要毫秒级别的真实值,请使用microtime函数。 - jitter
1
自 PHP 5.0.0 起,microtime(true) 返回一个带有毫秒的双精度值。 - corretge
32
time()*1000是一个糟糕的答案 :-( - malhal

10

使用这个:

intval(microtime(true)*1000)

5
要将Javascript、Actionscript和PHP之间的时间戳规范化为带有毫秒的整数,方法如下:
Javascript / Actionscript:
function getTimestamp(){
    var d = new Date();
    return Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds()).valueOf();
}

PHP:

function getTimestamp(){
    $seconds = microtime(true); // true = float, false = weirdo "0.2342 123456" format 
    return round( ($seconds * 1000) );
}

请参考“ben at sixg dot com's”的评论,查看PHP笔记:http://www.php.net/manual/en/function.gmmktime.php 摘录如下: 一般情况下,您可以认为mktime()首先将输入参数转换为GMT时间,然后调用gmmktime()生成GMT时间戳。 因此,在世界上任何地方,在同一实际时刻,time()始终会返回相同的值。
当给定特定的时间参数时,gmmktime()和mktime()将在计算适当的时间戳之前,将这些时间参数从适当的时区(gmmktime()为GMT,mktime()为本地时间)转换过来。
更新: 在某些版本的PHP中,带有毫秒的时间戳太大,无法以字符串形式显示。因此,请使用sprintf函数获取字符串值:
function getTimestamp($asString=false){
    $seconds = microtime(true); // false = int, true = float
    $stamp = round($seconds * 1000);
    if($asString == true){
        return sprintf('%.0f', $stamp);
    } else {
        return $stamp;
    }
}

4

在PHP5中,microtime()函数返回带有微秒的Unix时间戳,具体参考microtime()。如果不提供get_as_float参数,则会返回格式为“msec sec”的字符串,其中第一部分是毫秒部分,第二部分是秒部分。只需将其拆分为两个部分,即可获得时间戳的两个部分。


2
从 PHP DateTime 对象获取毫秒时间戳的方法如下:
<?php
date_default_timezone_set('UTC');
$d = new \DateTime('some_data_string');
$mts = $d->getTimestamp().substr($d->format('u'),0,3); // millisecond timestamp

2

针对PHP的简单答案:

function exact_time() {
    $t = explode(' ',microtime());
    return ($t[0] + $t[1]);
}

1

PHP 7 这个函数已经声明了它的返回类型。

function timestamp_ms(): int {
    $times = gettimeofday();
    $seconds = strval($times["sec"]);
    $milliseconds = strval(floor($times["usec"]/1000));
    $missingleadingzeros = 3-strlen($milliseconds);
    if($missingleadingzeros >0){
        for($i = 0; $i < $missingleadingzeros; $i++){
            $milliseconds = '0'.$milliseconds;
        }
    }
    return intval($seconds.$milliseconds);
}

PHP 5

function timestamp_ms() {
    $times = gettimeofday();
    $seconds = strval($times["sec"]);
    $milliseconds = strval(floor($times["usec"]/1000));
    $missingleadingzeros = 3-strlen($milliseconds);
    if($missingleadingzeros >0){
        for($i = 0; $i < $missingleadingzeros; $i++){
            $milliseconds = '0'.$milliseconds;
        }
    }
    return intval($seconds.$milliseconds);
}

0

当你需要以字符串格式获取毫秒时,我认为你应该使用:

public function get_millisecond() {
    list($milliPart, $secondPart) = explode(' ', microtime());
    $milliPart = substr($milliPart, 2, 3);
    return $secondPart . $milliPart;
}

这将解决一个bug,例如在某些获取毫秒的示例中,毫秒部分可能是0.056。一些示例将毫秒部分转换为浮点数,你将得到56而不是056。我认为有些人想要056。

特别是当你需要毫秒来排序一些数据时。

希望能帮到你。 :)


0

我最近遇到了一个问题,需要获取毫秒级的时间戳。仅仅将Unix时间戳乘以1000并不能解决问题,因为我需要非常精确地比较两个数据库条目。显然,PHP日期时间对象无法处理毫秒/微秒,但它仍然存储在日期时间字符串中。所以这是我的解决方案:

$dateObject = new \DateTime('2015-05-05 12:45:15.444', new \DateTimeZone('Europe/London')); $millis = $dateObject->format('v'); echo $dateObject->getTimestamp()*1000+$millis;

如果您使用format->('u')(当然要将时间戳乘以1000000)也可以用于微秒。希望您会发现这个有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接