修改PHP DateTime对象的微秒

Tim*_*Tim 10 php datetime

我有一个PHP DateTime对象,其创建的微秒如下:

$time = microtime(true);
$microseconds = sprintf('%06d', ($time - floor($time)) * 1000000);

$dt = new DateTime(date('Y-m-d H:i:s.' . $microseconds, $time));
Run Code Online (Sandbox Code Playgroud)

如何在$dt不创建全新DateTime实例的情况下修改微秒值?

Max*_*Max 7

从PHP 7.1开始DateTime :: setTime()支持微秒。

  • DateInterval 还添加了 f/F。 (2认同)

Jon*_*Jon 6

你不能

有三种方法可以修改的值DateTime实例:addsubmodify。我们可以立即排除这种情况addsub因为它们的工作原理DateInterval不具有亚秒级的精度。

modify接受标准识别格式之一的字符串。在这些格式中,这里只关注相对格式,因为其他格式以绝对方式工作。而且没有相对格式可以调整毫秒部分(无法识别该单位)。

  • 这是 [不再正确](/sf/answers/3737884391/)。然而,手册还没有反映 newstuff™。 (2认同)

aro*_*oss 6

这似乎自 7.1.0-rc4以来可用

$dt = new DateTime('2020-01-01 0:00');
$dt->modify('+500 ms');
Run Code Online (Sandbox Code Playgroud)

但是在 PHP 手册中找不到它。


小智 5

手动创建一个具有微秒的 DateTime 对象:

$d = new DateTime("15-07-2014 18:30:00.111111");
Run Code Online (Sandbox Code Playgroud)

获取当前时间(以微秒为单位)的 DateTime 对象:

$d = date_format(new DateTime(),'d-m-Y H:i:s').substr((string)microtime(), 1, 8);
Run Code Online (Sandbox Code Playgroud)

两个 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;
}
Run Code Online (Sandbox Code Playgroud)

本质上,它使用 strtotime 找到 DateTime 对象的差异,然后添加额外的微秒。

您需要我创建添加和子项吗?