SK2017
SK2017

Reputation: 773

StrToTime Doesn't work when passing a variable in

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

Answers (2)

chris85
chris85

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

tomas.lang
tomas.lang

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

Related Questions