0

I am drawing a bar graph and the values on the x-axis are the months in the last one year period. For example, this is March 2014; so the values on the x-axis range from April 2013 to March 2014 which is the current month.

I am using echo date('M'); to print the current month and echo date('M', strtotime(' -1 month')); and echo date('M', strtotime(' -2 month')); and so on to get all previous months.

These have been working fine until today, 29th March.

Where 'Feb' is supposed to be is also printing 'Mar'. I figure it is because February has 28 days.

Is there an easy fix to this without having to use if... else statements or if... else shorthand statements on all echo statements telling it to echo date('M', strtotime('-n month 2 days')); ?

John Conde
  • 217,595
  • 99
  • 455
  • 496
manlikeangus
  • 421
  • 9
  • 28
  • 2
    You could start by getting the timestamp for the first day of the current month – and then subtract months from there, that should avoid the problem with month having different number of days. – CBroe Mar 29 '14 at 18:31

1 Answers1

4

This is due to how PHP handles date math. You need to make sure you are always working with the first of the month to ensure February does not get skipped.

DateTime(), DateInterval(), and DatePeriod() makes this really easy to do:

$start    = new DateTime('11 months ago');
// So you don't skip February if today is day the 29th, 30th, or 31st
$start->modify('first day of this month'); 
$end      = new DateTime();
$interval = new DateInterval('P1M');
$period   = new DatePeriod($start, $interval, $end);
foreach ($period as $dt) {
    echo $dt->format('F Y') . "<br>";
}

See it in action

You can obviously change $dt->format('F Y') to $dt->format('M') to suit your specific purposes. I displayed the month and year to demonstrate how this worked.

John Conde
  • 217,595
  • 99
  • 455
  • 496