PHP:使用DateTime->修改两次,相同的结果

时间:2015-11-24 11:16:53

标签: php datetime

我想要两个变量。一次PUPPET_EXTRA_OPTS=--no-client 次,另一次-2 seconds次。这是我的代码:

+2 seconds

结果与预期不符:

$myTime = '2015-08-17 08:19:26';
$myTime = DateTime::createFromFormat('Y-m-d H:i:s', $myTime);

echo '<pre>';

var_dump( $myTime );

$myTime->modify('+2 seconds');
$myTime_p2 = $myTime;
$myTime->modify('-4 seconds');
$myTime_m2 = $myTime;

var_dump( $myTime );
var_dump( $myTime_p2 );
var_dump( $myTime_m2 );

echo '</pre>';

如您所见,object(DateTime)#1 (3) { ["date"]=> string(26) "2015-08-17 08:19:26.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(16) "America/New_York" } object(DateTime)#1 (3) { ["date"]=> string(26) "2015-08-17 08:19:24.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(16) "America/New_York" } object(DateTime)#1 (3) { ["date"]=> string(26) "2015-08-17 08:19:24.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(16) "America/New_York" } object(DateTime)#1 (3) { ["date"]=> string(26) "2015-08-17 08:19:24.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(16) "America/New_York" } $myTime_p2变量具有相同的值。那么问题出在哪里?

2 个答案:

答案 0 :(得分:1)

这应该有效:

$myTime->modify('+2 seconds');
$myTime_p2 = clone $myTime;
$myTime->modify('-4 seconds');
$myTime_m2 = clone $myTime;

答案 1 :(得分:1)

UPDATE
根据@ Im0rtality的评论使用DateTimeImmutable

$myTime = '2015-08-17 08:19:26';
$date = DateTimeImmutable::createFromFormat('Y-m-d H:i:s',$myTime);

print $date->modify('+2 seconds')->format('Y-m-d H:i:s') . PHP_EOL;
print $date->modify('-2 seconds')->format('Y-m-d H:i:s') . PHP_EOL;

/*
2015-08-17 08:19:28
2015-08-17 08:19:24
*/

您需要克隆初始对象以获得两个变体

$myTime = '2015-08-17 08:19:26';
$myTime = DateTime::createFromFormat('Y-m-d H:i:s', $myTime);

echo '<pre>';

var_dump( $myTime );

$myTime_p2 = clone $myTime;
$myTime_p2->modify('+2 seconds');

$myTime_m2 = clone $myTime;
$myTime_m2->modify('-4 seconds');

var_dump( $myTime );
var_dump( $myTime_p2 );
var_dump( $myTime_m2 );

echo '</pre>';

<pre>object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2015-08-17 08:19:26.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
}
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2015-08-17 08:19:26.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
}
object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2015-08-17 08:19:28.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
}
object(DateTime)#3 (3) {
  ["date"]=>
  string(26) "2015-08-17 08:19:22.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
}
</pre>