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

PHP:使用DateTime->;修改两次,结果相同,php,datetime,Php,Datetime,我想要两个变量。一次-2秒,另一次+2秒。这是我的代码: $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 sec

我想要两个变量。一次
-2秒
,另一次
+2秒
。这是我的代码:

$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>';
如您所见,
$myTime\u p2
$myTime\u m2
变量具有相同的值。那么问题出在哪里呢?

这应该可以:

$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
*/
更新
根据@Im0rtality的以下评论,使用
DateTimeImmutable

$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>

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

$myTime='2015-08-17 08:19:26';
$myTime=DateTime::createFromFormat('Y-m-dh:i:s',$myTime);
回声';
var_dump($myTime);
$myTime_p2=克隆$myTime;
$myTime_p2->修改('+2秒');
$myTime_m2=克隆$myTime;
$myTime_m2->修改('-4秒');
var_dump($myTime);
变量转储($myTime\u p2);
var_dump($myTime_m2);
回声';
对象(日期时间)#1(3){
[“日期”]=>
字符串(26)“2015-08-17 08:19:26.000000”
[“时区类型”]=>
int(3)
[“时区”]=>
字符串(13)“欧洲/柏林”
}
对象(日期时间)#1(3){
[“日期”]=>
字符串(26)“2015-08-17 08:19:26.000000”
[“时区类型”]=>
int(3)
[“时区”]=>
字符串(13)“欧洲/柏林”
}
对象(日期时间)#2(3){
[“日期”]=>
字符串(26)“2015-08-17 08:19:28.000000”
[“时区类型”]=>
int(3)
[“时区”]=>
字符串(13)“欧洲/柏林”
}
对象(日期时间)#3(3){
[“日期”]=>
字符串(26)“2015-08-17 08:19:22.000000”
[“时区类型”]=>
int(3)
[“时区”]=>
字符串(13)“欧洲/柏林”
}

您只有一个对象和两个指向同一对象的链接。您应该复制对象以创建新的OneHanks。你能给我举个例子吗?提前感谢您。或者您可以使用类,它返回修改后的副本,但原始副本保持不变。谢谢您的回答。山姆很快就回答和评论了。所以我把他记对了。谢谢@Im0rtality。谢谢@Im0rtality,我编辑了我的答案,加入了
datetimeimmumatable
的示例用法,这很好@johncoreh,只是要注意克隆和
->modify
操作的顺序,因为你应该先克隆并修改克隆。@AlexAndrei,谢谢你的提示。我提出了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>