我从一个基本的DateTime对象开始,我想在将来显示一个日期,例如。未来5 - 10年。
我尝试使用DateInterval并添加到初始日期,但我想继续使用初始日期,这是我需要帮助的地方
<?php
$initialDate = DateTime::createFromFormat('j-n-Y', '1-6-2015');
$initialDate->setTime(mt_rand(0,12),mt_rand(0,59),mt_rand(0,59)); // set a random time of day, not really relevant
print $initialDate->format('c') . PHP_EOL;
// 2015-06-01T07:08:22+02:00
print $initialDate->format('Y-m-d') . PHP_EOL;
// 2015-06-01
$interval = 'P' . mt_rand(5,11) . 'Y';
$intervalObj = new DateInterval($interval);
$futureDate = $initialDate->add($intervalObj)->format("Y-m-d");
print $futureDate . PHP_EOL;
// 2023-06-01 - this is the expected result
print $initialDate->format('Y-m-d') . PHP_EOL;
// 2025-06-01 - i understand why this happens
我想获得初始日期,即2015-06-01
任何指向正确方向的人都会受到赞赏。 谢谢!
答案 0 :(得分:1)
DateTime :: add方法实际上会不可逆地影响对象的内容。因此,如果您需要原始数据,则必须在对象上使用CREATE TABLE tests
(eid int,ename VARCHAR(20),hire_date DATETIME , end_date Datetime)
INSERT INTO dbo.tests
( eid ,
ename ,
hire_date ,
end_date
)
VALUES ( 1 , -- eid - int
'A1' , -- ename - varchar(20)
'2015-01-03 10:41:43' , -- hire_date - datetime
'2015-03-03 10:41:43' -- end_date - datetime
),
( 2 , -- eid - int
'A2' , -- ename - varchar(20)
'2015-05-03 10:41:43' , -- hire_date - datetime
'2015-06-03 10:41:43' -- end_date - datetime
)
SELECT TOP 1 eid,ename,DATEDIFF(DAY,hire_date,end_date) AS DaysWORKED FROM tests ORDER BY DATEDIFF(DAY,hire_date,end_date) desc
方法复制该对象。
您可以使用->add()
复制原始日期对象,然后将其设置为您想要记住的状态。就像这样
clone