PHP date() and strtotime() return wrong months on 31st

不羁的心 提交于 2019-11-26 06:41:28

问题


I\'m using date()and strtotime() functions to display the next 3 months in a dropdown list.

PHP Code:

   echo date(\"m/Y\",strtotime(\"+0 months\")); 
   echo date(\"m/Y\",strtotime(\"+1 months\"));
   echo date(\"m/Y\",strtotime(\"+2 months\")); 

However, if the script is running when the server date is on 30th or 31st, the next month, which is Feburary, will be displayed as March instead. i.e. the script above is supposed to return

01/2012
02/2012
03/2012

But, instead of that, it actually displays

01/2012
03/2012
03/2012

that is because Feburary doesn\'t have 30th or 31st, so the script translates \"31/02\" into \"01/03\".

I have read the strtotime() page on php.net, this problem has been raised, but there has not been any useful solutions. So can anyone please help me to find a simple way to solve this problem? Thanks in advance!


回答1:


As mentioned within the documentation, you should pass the date for the first day of the current month as the second parameter to the strtotime() function:

$base = strtotime(date('Y-m',time()) . '-01 00:00:01');
echo date('m/Y',strtotime('+0 month', $base));
echo date('m/Y',strtotime('+1 month', $base));
echo date('m/Y',strtotime('+2 month', $base));

See that it works: http://ideone.com/eXis9

01/2012

02/2012

03/2012




回答2:


Try using "first day of" in your strtotime, like this:

strtotime("first day of +1 month");

This will fix dates ( in the event today was Jan 30th ) such as 02-30 (Yields march 2nd) by converting it to 02-01 (Feb 1st) which then gives you the correct month. It's a little cleaner than other methods, and easier to remember.




回答3:


echo date('m/Y', strtotime(date('Y-m') . '-01 +2 months'));

Just hard-code it to be the first of the month.




回答4:


Don't use strtotime() for getting offset date by month(s). It works properly only in PHP 5.3+. The best way to solve such problem is using mktime(). Below is a sample code:

function getOffsetByMonths($nMonths, $nNow = 0) {
    if ($nNow)
        return mktime(0, 0, 0, date('n', $nNow)+ $nMonths, 1, date('Y', $nNow));
    else
        return mktime(0, 0, 0, date('n')+ $nMonths);
}
$nNow = mktime(0, 0, 0, 1, 31, 2013);
echo "Now: ". date("Y-m-d", $nNow).
"<br>(Now - 1 month): ". date("Y-m", getOffsetByMonths(-1, $nNow)). "-xx".
"<br>(Now - 2 month): ". date("Y-m", getOffsetByMonths(-2, $nNow)). "-xx".
"<br>(Now - 3 month): ". date("Y-m", getOffsetByMonths(-3, $nNow)). "-xx";


来源:https://stackoverflow.com/questions/9058523/php-date-and-strtotime-return-wrong-months-on-31st

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!