$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不同。知道为什么吗?
答案 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可能不相等。