如何在两个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()
答案 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:00
和2038-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;
}
答案 3 :(得分:-1)
答案 4 :(得分:-2)
DateTime日期仅存储为整秒。如果您仍然需要两个DateTime日期之间的毫秒数,那么您可以使用getTimestamp()以秒为单位获取每个时间(然后获取差异并将其转换为毫秒):
$seconds_diff = $date2.getTimestamp() - $date.getTimestamp()
$milliseconds_diff = $seconds_diff * 1000