Reputation: 773
So I have an array of dates like this -
Contents of $monthsArray
2015-02-01
2015-03-01
2015-04-01
2015-05-01
2015-06-01
2015-07-01
2015-08-01
2015-09-01
2015-10-01
I want to loop through the array and minus one year from each date -
foreach ($monthsArray as $month)
{
$ytdFrom = date("$month", strtotime('-1 year'));
$ytdTo = $month;
}
The value from the first loop of $ytdFrom is still = 2015-02-01, and so on, the ytdFrom doesn't minus the one year.
Although If run the following code -
$ytdFrom= date('Y-m-d',strtotime('-1 year')); // Todays date 2016-02-01
This would = 2015-02-01.
I can't see why this is happening, strToTime requires a string as its parameter and that is exactly what I'm passing in.
Any Ideas?
Upvotes: 2
Views: 2012
Reputation: 23880
The date
function first takes the format you want it to output the string from, then the date you want formatted. strtotime
takes the time you wanted formatted and an optional second parameter for the time the function should start from (unix timestamp). If not specified it is the current time. So for a demo:
echo date('y-m-d', strtotime('-1 year', strtotime('2015-03-01')));
Outputs:
14-03-01
Because it is one year before 2015-03-01
.
PHP Demo: https://eval.in/511126
Where as,
echo date('y-m-d', strtotime('-1 year'));
outputs as 15-02-01
. because that is 1 year
before today.
...so to conclude you'd really want:
echo date('y-m-d', strtotime('-1 year', strtotime($month)));
and modify the date
values to whatever format you want; http://php.net/manual/en/function.date.php.
Upvotes: 2
Reputation: 499
Yes, problem is that strtotime
returns value based from actual time. This is, why strtotime('-1 year')
returns 2015-02-01
.
But you need substract some interval from your date, and for that is this function: http://php.net/manual/en/function.date-sub.php.
From my point of view is best way to do this with DateTime
object (but you still can use procedural style like date_*
), like this:
(new DateTime('2016-02-01'))
->sub(DateInterval::createFromDateString('1 year'))
->format('Y-m-d');
Upvotes: 0