格式化php datetime对象以在保留日期的同时显示将来的日期

时间:2015-07-03 10:31:45

标签: php

我从一个基本的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

任何指向正确方向的人都会受到赞赏。 谢谢!

1 个答案:

答案 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