PHP datetime子问题

时间:2011-12-10 20:56:19

标签: php datetime

$currentDT = new \DateTime(); 
$filterRange = new \DateInterval('PT30S'); 
$filterDate = $currentDT->sub($filterRange); 
var_dump($currentDT); 
var_dump($filterDate);

输出:

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是相同的...即使它们应该是30s不同。知道为什么吗?

3 个答案:

答案 0 :(得分:7)

这是预期的行为,减法作用于原始对象,然后返回。这可以通过246输出中的var_dump()看出,表示它们是同一个对象。

如果您希望保持原始对象不变,则在进行减法之前,您需要clone

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

答案 1 :(得分: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关键字。

答案 2 :(得分:0)

唯一的方法是克隆而不是创建2个连续的日期时间,因为根据服务器的处理速度,instance1和instance2可能不相等。