2014-02-13 83 views
5

我有创建微秒的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)); 

如何修改的$dt微秒值,而无需创建一个全新的DateTime实例?

回答

5

你不能。

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

modify接受standard recognized formats之一的字符串。在这些格式中,只有relative这些是有用的,因为其他的以绝对的方式工作;并且没有允许调整毫秒部分的相对格式(该单元不被识别)。

+1

+1这里有一张悲伤的脸,这是正确的答案,但不是我期望从PHP获得的正确行为。 –

+0

那么'Datetime'是否需要转换为一个字符串,在那里操作,然后再转换回'Datetime'? – Jason

+0

@Jason是的,没有别的办法AFAIK。 – Jon

0

手动创建微秒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对象的差异。

你需要我来创建添加和子?

+0

如果微秒之间的差异大于一秒,那么结果不正确,除此之外,由于PHP不支持这一点,因此您处于正确的轨道 –

+0

您能用一个示例来解释吗?我认为微秒的差距超过一秒是不可能的? – 2014-07-21 15:38:09

+0

var_dump(mdiff(new DateTime('2010-01-01 00:00:01.800000 + 01'),new DateTime('2010-01-01 00:00:00.700000 + 01'))); var_dump(mdiff(new DateTime('2010-01-01 00:00:01。800000 + 01'),新DateTime('2010-01-01 00:00:00.900000 + 01'))); 两者都返回相同的“1.100000”,不应该第二次返回0.90000?或者我是累了,需要或一些咖啡因:) –

1

截至PHP 7.1 DateTime :: setTime()支持微秒。