2011-12-10 85 views
1
$currentDT = new \DateTime(); 
$filterRange = new \DateInterval('PT30S'); 
$filterDate = $currentDT->sub($filterRange); 
var_dump($currentDT); 
var_dump($filterDate); 

OUTPUT:PHP日期時間子問題

object(DateTime)[246] 
    public 'date' => string '2011-12-10 15:53:42' (length=19) 
    public 'timezone_type' => int 3 
    public 'timezone' => string 'America/New_York' (length=16) 
object(DateTime)[246] 
    public 'date' => string '2011-12-10 15:53:42' (length=19) 
    public 'timezone_type' => int 3 
    public 'timezone' => string 'America/New_York' (length=16) 

$ currentDT和$ filterDate都是一樣的...即使他們應該是30年代不同。任何想法爲什麼?

回答

7

這是預期的行爲,減法作用於原始對象,然後返回。這可以通過var_dump()輸出中的246來看出,表示它們是同一個對象。

如果您希望保持原始對象不變,您需要在執行減法之前使用clone

$currentDT = new \DateTime('2011-12-13 14:15:16'); 
$filterRange = new \DateInterval('PT30S'); 
$filterDate = clone $currentDT; 
$filterDate->sub($filterRange); 
var_dump($currentDT, $filterDate); 
0

DateTime::sub更改當前對象中的日期,並返回方法鏈接的副本。因此,在您的示例中,您正在更改這兩個對象的日期,因此兩者都將設置爲30秒前。

嘗試此 - 它使用了兩個單獨初始化的對象的比較:

$current1 = new \DateTime(); 
$current2 = new \DateTime(); 

$filterRange = new \DateInterval('PT30S'); 
$current2->sub($filterRange); 
var_dump($current1); // Should return the current time 
var_dump($current2); // Should return the current time - 30 seconds 

,或者如@salathe所指出的,使用過程中的clone關鍵字。

0

去代替克隆創建日期時間的連續2個isntances的,因爲有一個機會,INSTANCE1和INSTANCE2不相等取決於服務器的處理速度的唯一途徑。