我正在绘制条形图,x轴上的值是过去一年中的月份。例如,这是2014年3月;所以x轴上的值范围从2013年4月到2014年3月,也就是当月。
我正在使用echo date('M');
打印当前月份echo date('M', strtotime(' -1 month'));
和echo date('M', strtotime(' -2 month'));
等等以获取前几个月。
直到今天,3月29日,这些工作一直很好。
'2月'应该也是'Mar'。我认为这是因为二月有28天。
是否可以轻松解决此问题,而无需对所有if... else
语句使用if... else
语句或echo
简写语句告诉echo date('M', strtotime('-n month 2 days'));
?
答案 0 :(得分:4)
这是由于PHP如何处理日期数学。你需要确保你总是在本月的第一天工作,以确保不会跳过2月。
DateTime()
,DateInterval()
和DatePeriod()
让这很容易做到:
$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>";
}
您显然可以将$dt->format('F Y')
更改为$dt->format('M')
以适合您的特定目的。我展示了月份和年份,以证明这是如何运作的。
答案 1 :(得分:0)
感谢John Conde
这就是我使用它的方式:
$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();
//So it doesn't skip months with days less than 31 when coming off a 31-day month
$end->modify('last day of this month');
$interval = new DateInterval('P1M');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $dt)
{
$monthNames[] = $dt->format('M');
}
这是因为我需要在<span>
内内联回调它们。
因此,数组中的第一个值用作:
<span><?php echo $monthNames[0]; ?></span> //As of March 2014, this prints Apr
第二个值:
<span><?php echo $monthNames[1]; ?></span> //As of March 2014, this prints May
等等。
希望这可以帮助那些在这里寻找同样修复的人。