在PHP中获取上个月的日期


84

我想知道上个月的日期。我这样写:

$prevmonth = date('M Y');

这给了我当前的月份/年份。我不知道我是否应该使用strtotimemktime。时间戳记了吗?我是否需要在事后添加一些内容以进行重置,以便在我网站上所有时间戳的所有时间中,日期都不设置为上个月?我正在尝试RTM,但很难解决。

Answers:


208

获取上个月的日期很简单

echo date("Y-n-j", strtotime("first day of previous month"));
echo date("Y-n-j", strtotime("last day of previous month"));

11月3日返回

2014-10-1
2014-10-31

7
这个代码还不够好,可能会导致您的代码出错:$time = strtotime('2011-03-30 01:01:01'); echo date('r', strtotime('-1 month', $time));这个代码将返回Wed,2011年3月2日,星期三,01:01:01-不是2月!使用strtotime('first day of previous month')替代
Ostin

@OzzyCzech当您在3月3日运行它时,它返回10月1日至31日吗?
未知开发人员

$ data_day_str = strtotime(“上个月”,strtotime('2011-03-30 01:01:01')); 您将获得2011
。– Rodrigo Serzedello 19/12/2

31
echo strtotime("-1 month");

这将准确输出上个月的时间戳。之后,您无需重设任何内容。之后,如果要使用英语格式,则可以使用date()格式化时间戳,即:

echo date("Y-m-d H:i:s",strtotime("-1 month"));

12
今天是2012年10月31日。date(“ Ymd”,strtotime(“-1 month”)); 返回2012-10-01。:(
Todd

7
@toddsler正确。-1个月与编写-30天非常相似,后者在一年中的某些日期将跳过1个月或保留在同一个月,因此请谨慎使用此方法。
Silkfire

请勿使用此解决方案!先前的评论是正确的,您将有仅在当月31日(或3月29,
少年

19
$prevmonth = date('M Y', strtotime("last month"));

3
这与date('M Y',strtotime(“-1 month”))相同,如果您执行date('M Y',strtotime(“ 2017-07-31 last month”))这样的操作,它将返回2017-07-01,请注意!date('M Y',strtotime('2017-07-31上个月的第一天'))会给您您想要的
Shadoweb,2017年

12

不正确的答案是:

$lastMonth = date('M Y', strtotime("-1 month"));
$lastDate = date('Y-m', strtotime('last month'));

原因是,如果当前月份是30天以上,而上个月是29天,则$ lastMonth会少于当前月份。

例如

If $currentMonth = '30/03/2016';
echo $lastMonth = date('m-Y', strtotime("-1 month")); => 03-2016
echo $lastDate = date('Y-m', strtotime('last month')); => 2016-03

正确答案将是:

echo date("m-Y", strtotime("first day of previous month")); => 02-2016
echo sprintf("%02d",date("m")-1) . date("-Y"); => 02-2016
echo date("m-Y",mktime(0,0,0,date("m")-1,1,date("Y"))); => 02-2016

1
如果您删除echo sprintf(“%02d”,date(“ m”)-1),我会赞成。date(“-Y”); => 02-2016。如果我们在一月份,它将回答今年的第0个月,而不是去年的第12个月!
塔马

6

如果您只想获得上个月的资料,则可以像下面这样使用

$prevmonth = date('M Y', strtotime('-1 months'));

如果您想获得上个月的同一天,则可以使用如下..

$prevmonth = date('M Y d', strtotime('-1 months'));

如果您想获取上个月的最后日期,则可以使用如下所示的方式...

$prevmonth = date('M Y t', strtotime('-1 months'));

如果您想获取上个月的第一个日期,则可以使用以下方法...

$prevmonth = date('M Y 1', strtotime('-1 months'));

3
请注意本月31日!它将给您本月的第一天!看上面。
Shadoweb '17

6
echo date('Y',strtotime("-1 year"));        //last year<br>
echo date('d',strtotime("-1 day"));     //last day<br>
echo date('m',strtotime("-1 month"));       //last month<br>

3
当前日期为2018/03/31时,此答案不正确。也像这样的
Ngoc Nam

4

当前几个月比当前时间短时,发现此错误。

echo date("Y-m-d H:i:s",strtotime("-1 month"));

尝试3月30日,您将获得2012-03-01而不是2012-02 ...

寻求更好的解决方案...


3
这个答案是正确的(-1个月在所有情况下均无法正常工作)。对于上个月,请使用strtotime('last month')。
Mike

1
上个月或-1个月返回相同的值。
Etienne Dupuis,2016年

3
public function getLastMonth() {
    $now = new DateTime();
    $lastMonth = $now->sub(new DateInterval('P1M'));
    return $lastMonth->format('Ym');
}

1
对于不会工作2015-10-31在PHP 5.5和5.6.11。您将获得201510与相同的行为strtotime('- 1 month)
pmayer 2015年

2

使用此短代码获取任何给定日期的上个月:

$tgl = '25 january 2012';

$prevmonth = date("M Y",mktime(0,0,0,date("m", strtotime($tgl))-1,1,date("Y", strtotime($tgl))));
echo $prevmonth;

结果是2011年12月。在与上个月相距较短的月份中工作。


2
$lastMonth = date('M Y', strtotime("-1 month"));
var_dump($lastMonth);
$lastMonth = date('M Y', mktime(0, 0, 0, date('m') - 1, 1, date('Y')));
var_dump($lastMonth);

4
虽然代码本身可以在某种程度上自我解释,但是它对其他用户解释您的答案而不只是给出代码很有帮助。
Turnerj

1

您可以使用strtotime,这在这种情况下非常有用:

$timestamp = strtotime('-1 month');
var_dump(date('Y-m', $timestamp));

会让你:

string '2009-11' (length=7)

1
$time = mktime(0, 0, 0, date("m"),date("d")-date("t"), date("Y"));
$lastMonth = date("d-m-Y", $time);

要么

$lastMonth = date("m-Y", mktime() - 31*3600*24);

在30.03.2012上工作


1

哦,我知道了,除非您在这种情况下遇到了同样的问题,否则请忽略:

$prevmonth = date("M Y",mktime(0,0,0,date("m")-1,1,date("Y")));

1

我发现的最佳解决方案是:

function subtracMonth($currentMonth, $monthsToSubtract){
        $finalMonth = $currentMonth;
        for($i=0;$i<$monthsToSubtract;$i++) {
            $finalMonth--;
            if ($finalMonth=='0'){
                $finalMonth = '12';
            }

        }
        return $finalMonth;

    }

因此,如果我们在3月3日,并且想减去5个月,

subtractMonth(3,5);

这将给10(十月)。如果也需要年份,可以这样做:

function subtracMonth($currentMonth, $monthsToSubtract){
    $finalMonth = $currentMonth;
    $totalYearsToSubtract = 0;
    for($i=0;$i<$monthsToSubtract;$i++) {
        $finalMonth--;
        if ($finalMonth=='0'){
            $finalMonth = '12';
            $totalYearsToSubtract++;
        }

    }
    //Get $currentYear
    //Calculate $finalYear = $currentYear - $totalYearsToSubtract 
    //Put resulting $finalMonth and $finalYear into an object as attributes
    //Return the object

}

0

这个对我有用:

今天是:31/03/2012

echo date("Y-m-d", strtotime(date('m', mktime() - 31*3600*24).'/01/'.date('Y').' 00:00:00')); // 2012-02-01
echo  date("Y-m-d", mktime() - 31*3600*24); // 2012-02-29

仅在58.3(3)%的情况下有效。那二月,四月,六月,九月和十一月呢?他们没有31天。
塔兹2012年

0

如果您想获取上个月的第一个日期,那么您可以像下面这样使用...$prevmonth = date('M Y 1', strtotime('-1 months'));什么?第一次约会永远是1:D


2012年10月31日。返回日期2012年10月1日
山本彰(Akira Yamamoto)

0

这个问题已经很老了,但是无论如何这里还是有问题。如果您只想获取前一个月,而当天又无所谓,则可以使用以下方法:

$date = '2014-01-03';

$dateTime = new DateTime($date);

$lastMonth = $dateTime->modify('-' . $dateTime->format('d') . ' days')->format('F Y');

echo $lastMonth; // 'December 2013'

0

只需在上个月获得即可。

例:

今天是:2020-09-02

码:

echo date('Y-m-d', strtotime(date('Y-m-d')." -1 month"));

结果:

2020-08-02


欢迎来到StackOverflow!也许,您还应该考虑解释如果日期是311月而不是1月或8月(如2020 May 31变为2020 April 31,则不存在)会发生什么情况
xKobalt

PHP内置函数“日期”,处理它。
SL-phpdeveloper
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.