我有創建微秒的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實例?
我有創建微秒的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實例?
你不能。
有三種方法可以修改DateTime
實例的值:add
,sub
和modify
。我們可以立即排除add
和sub
,因爲它們的工作方式是DateInterval
,它不具有亞秒精度。
modify
接受standard recognized formats之一的字符串。在這些格式中,只有relative這些是有用的,因爲其他的以絕對的方式工作;並且沒有允許調整毫秒部分的相對格式(該單元不被識別)。
我有一個類似的問題,最後不得不包住整個事情
手動創建微秒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對象的差異。
你需要我來創建添加和子?
如果微秒之間的差異大於一秒,那麼結果不正確,除此之外,由於PHP不支持這一點,因此您處於正確的軌道 –
您能用一個示例來解釋嗎?我認爲微秒的差距超過一秒是不可能的? – 2014-07-21 15:38:09
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?或者我是累了,需要或一些咖啡因:) –
截至PHP 7.1 DateTime :: setTime()支持微秒。
+1這裏有一張悲傷的臉,這是正確的答案,但不是我期望從PHP獲得的正確行爲。 –
那麼'Datetime'是否需要轉換爲一個字符串,在那裏操作,然後再轉換回'Datetime'? – Jason
@Jason是的,沒有別的辦法AFAIK。 – Jon