如何在两个dateTime obj之间获得毫秒?

时间:2010-10-26 18:56:44

标签: php datetime

如何在两个DateTime个对象之间获得毫秒数?

$date = new DateTime();
$date2 = new DateTime("1990-08-07 08:44");

我尝试按照下面的评论,但我收到了错误。

$stime = new DateTime($startTime->format("d-m-Y H:i:s"));
$etime = new DateTime($endTime->format("d-m-Y H:i:s")); 
$millisec = $etime->getTimestamp() - $stime->getTimestamp();` 

我收到错误

  

调用未定义的方法DateTime :: getTimestamp()

5 个答案:

答案 0 :(得分:17)

从严格意义上说,你不能。

这是因为DateTime类的最小时间单位是秒。

如果您需要包含毫秒的测量值,请使用microtime()


修改

另一方面,如果您只想获得两个ISO-8601 datetimes之间的间隔(毫秒),那么一个可能的解决方案就是

function millisecsBetween($dateOne, $dateTwo, $abs = true) {
    $func = $abs ? 'abs' : 'intval';
    return $func(strtotime($dateOne) - strtotime($dateTwo)) * 1000;
}

请注意,默认情况下,上述函数会返回绝对差值。如果您想知道第一个日期是否更早,则将第三个参数设置为false。

// Outputs 60000
echo millisecsBetween("2010-10-26 20:30", "2010-10-26 20:31");

// Outputs -60000 indicating that the first argument is an earlier date
echo millisecsBetween("2010-10-26 20:30", "2010-10-26 20:31", false);

在时间数据类型的大小为32位的系统上,例如Windows7或更早版本,millisecsBetween仅适用于1970-01-01 00:00:002038-01-19 03:14:07之间的日期(请参阅Year 2038 problem)。

答案 1 :(得分:4)

很抱歉找出一个旧问题,但我找到了一种方法来从DateTime对象中获取毫秒时间戳:

function dateTimeToMilliseconds(\DateTime $dateTime)
{
    $secs = $dateTime->getTimestamp(); // Gets the seconds
    $millisecs = $secs*1000; // Converted to milliseconds
    $millisecs += $dateTime->format("u")/1000; // Microseconds converted to seconds
    return $millisecs;
}

但是,您的DateTime对象需要包含微秒(格式为u):

$date_str = "20:46:00.588";

$date = DateTime::createFromFormat("H:i:s.u", $date_str);

这仅适用于PHP 5.2,因此添加了对DateTime的微秒支持。

使用此功能,您的代码将变为以下内容:

$date_str = "1990-08-07 20:46:00.588";
$date1 = DateTime::createFromFormat("Y-m-d H:i:s.u", $date_str);

$msNow = (int)microtime(true)*1000;

echo $msNow - dateTimeToMilliseconds($date1);

答案 2 :(得分:0)

DateTime从5.2.2开始支持微秒。在date函数的文档中对此进行了提及,但这里需要重复。您可以用小数秒创建一个DateTime,然后使用“ u”格式字符串检索该值。

<?php
// Instantiate a DateTime with microseconds.
$d = new DateTime('2011-01-01T15:03:01.012345Z');

// Output the microseconds.
echo $d->format('u'); // 012345

// Output the date with microseconds.
echo $d->format('Y-m-d\TH:i:s.u'); // 2011-01-01T15:03:01.012345

// Unix Format
echo "<br>d2: ". $d->format('U.u');

function get_data_unix_ms($data){
    $d = new DateTime($data);
    $new_data = $d->format('U.u');
    return $new_data;
}

function get_date_diff_ms($date1, $date2)
    {
        $d1 = new DateTime($date1);
        $new_d1 = $d1->format('U.u');

        $d2 = new DateTime($date2);
        $new_d2 = $d2->format('U.u');

        $diff = abs($new_d1 - $new_d2);

        return $diff;
    }

https://www.php.net/manual/en/class.datetime.php

答案 3 :(得分:-1)

这里有一个功能可以进行+测试。

https://gist.github.com/vudaltsov/0bb623b9e2817d6ce359eb88cfbf229d

答案 4 :(得分:-2)

DateTime日期仅存储为整秒。如果您仍然需要两个DateTime日期之间的毫秒数,那么您可以使用getTimestamp()以秒为单位获取每个时间(然后获取差异并将其转换为毫秒):

$seconds_diff = $date2.getTimestamp() - $date.getTimestamp()
$milliseconds_diff = $seconds_diff * 1000