今天同事发现了一个php的月份bug,说月份列表里怎么出现了两个3月份,代码是大概是这样的:
$month[]=date('Y年m月',strtotime('today')); $month[]=date('Y年m月',strtotime('-1 month')); $month[]=date('Y年m月',strtotime('-2 month')); $month[]=date('Y年m月',strtotime('-3 month')); $month[]=date('Y年m月',strtotime('-4 month')); $month[]=date('Y年m月',strtotime('-5 month'));
利用strtotime来计算最近了六个月份,这个bug之前没有被发现因为只有在每月的29,30,31号才会发作:因为php默认取当前时间来做计算,比如今天7月29号减去5个月应该是2月29号,因为今年的2月份没有29号,所以就到了3月份了。于是修改了下:
$month[]=date('Y年m月',strtotime('today')); $month[]=date('Y年m月',strtotime('first day of -1 month')); $month[]=date('Y年m月',strtotime('first day of -2 month')); $month[]=date('Y年m月',strtotime('first day of -3 month')); $month[]=date('Y年m月',strtotime('first day of -4 month')); $month[]=date('Y年m月',strtotime('first day of -5 month'));
但是这个只有在php 5.3以上的版本中才会起作用,在php 5.2的版本有bug,需要这样处理:
$month[]=date('Y年m月',strtotime('today')); $month[]=date('Y年m月',mktime(0,0,0,date('n')-1,1,date('Y'))); $month[]=date('Y年m月',mktime(0,0,0,date('n')-2,1,date('Y'))); $month[]=date('Y年m月',mktime(0,0,0,date('n')-3,1,date('Y'))); $month[]=date('Y年m月',mktime(0,0,0,date('n')-4,1,date('Y'))); $month[]=date('Y年m月',mktime(0,0,0,date('n')-5,1,date('Y')));
参考链接:
php strtotime函数
Version difference for strtotime(‘first day of last month’)?