我有一个PHP DateTime对象,其微秒创建如下:
$time = microtime(true);
$microseconds = sprintf('%06d', ($time - floor($time)) * 1000000);
$dt = new DateTime(date('Y-m-d H:i:s.' . $microseconds, $time));
如何在不创建全新DateTime实例的情况下修改$dt
的微秒值?
答案 0 :(得分:5)
你不能。
有三种方法可以修改DateTime
实例的值:add
,sub
和modify
。我们可以立即排除add
和sub
,因为它们的工作条件是DateInterval
,但不具有亚秒精度。
modify
接受standard recognized formats之一的字符串。在这些格式中,只有relative格式在这里是有意义的,因为其他格式以绝对的方式工作;并且没有相对格式允许调整msec部分(该单元无法识别)。
答案 1 :(得分:4)
从PHP 7.1开始 DateTime :: setTime()支持微秒。
答案 2 :(得分:3)
这似乎已经可用since 7.1.0-rc4
$dt = new DateTime('2020-01-01 0:00');
$dt->modify('+500 ms');
但是在PHP手册中找不到它。
答案 3 :(得分:2)
使用微秒手动创建DateTime对象:
$d = new DateTime("15-07-2014 18:30:00.111111");
以微秒为单位获取当前时间的DateTime对象:
$d = date_format(new DateTime(),'d-m-Y H:i:s').substr((string)microtime(), 1, 8);
两个DateTime对象之间的差异,以微秒为单位(例如,返回:2.218939)
//Returns the difference, in seconds, between two datetime objects including
//the microseconds:
function mdiff($date1, $date2){
$date1sec = strtotime($date1->format('d-m-Y H:i:s.u'));
$date2sec = strtotime($date2->format('d-m-Y H:i:s.u'));
//Absolute val of Date 1 in seconds from (EPOCH Time) - Date 2 in seconds from (EPOCH Time)
$secdiff = abs($date1sec-$date2sec);
//Creates variables for the microseconds of date1 and date2
$micro1 = $date1->format("u");
$micro2 = $date2->format("u");
if (($date1sec<$date2sec && $micro1>$micro2)||($date1sec>$date2sec && $micro1<$micro2)){
$microdiff = abs(1000000 - abs($micro1-$micro2));
$secdiff = $secdiff - 1;
} else {
$microdiff = abs($micro1 - $micro2);
}
//Creates the variable that will hold the seconds (?):
$difference = $secdiff.".".$microdiff;
return $difference;
}
基本上,它使用strtotime找到DateTime对象的差异,然后再添加额外的微秒。
你需要我创建add和sub吗?
答案 4 :(得分:0)
我有类似的问题,最终不得不包装整件事