30

我有点不确定为什么无法找到上个月的最后一天。每个步骤似乎都正常工作,除非创建最终日期。

<?php

$currentMonth = date('n');
$currentYear = date('Y');

if($currentMonth == 1) {
    $lastMonth = 12;
    $lastYear = $currentYear - 1;
}
else {
    $lastMonth = $currentMonth -1;
    $lastYear = $currentYear;
}

if($lastMonth < 10) {
    $lastMonth = '0' . $lastMonth;
}

$lastDayOfMonth = date('t', $lastMonth);

$lastDateOfPreviousMonth = $lastYear . '-' . $lastMonth . '-' . $lastDayOfMonth;

$newLastDateOfMonth = date('F j, Y', strtotime($lastDateOfPreviousMonth));

?>

$lastDateOfPreviousMonth按预期返回 2012-09-30;但是,在尝试将其转换为 2012 年 9 月 30 日之后 -$newLastDateOfMonth将返回 2012 年 10 月 1 日。我似乎哪里出错了?

编辑:如果在 2013 年 1 月 1 日使用date("t/m/Y", strtotime("last month"));date('Y-m-d', strtotime('last day of previous month'));其中任何一个仍然可行,即它们会考虑到年份的变化吗?

4

5 回答 5

96
echo date('Y-m-d', strtotime('last day of previous month'));
//2012-09-30

或者

$date = new DateTime();
$date->modify("last day of previous month");
echo $date->format("Y-m-d");

稍后编辑:php.net 文档 - strtotime()、DateTime 和 date_create() 的相对格式

于 2012-10-01T13:17:21.890 回答
21

为此有一个 php 函数。

echo date("t/m/Y", strtotime("last month"));
于 2012-10-01T13:19:55.520 回答
4

本月的第一天,负 1 秒。

echo date('Y-m-d',strtotime('-1 second',strtotime(date('m').'/01/'.date('Y'))));

这里的例子。

于 2012-10-01T13:19:27.007 回答
2

请尝试以下答案。

代码:

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

您将获得前 12 个月的最后一天。

例子:

    <?php
for ($i = 1; $i <= 12; $i++) {
    $months[] = date("t/m/Y l", strtotime(date('Y-m')." -$i months"));
}
print_r($months);
?>

输出:

Array
(
    [0] => 30/11/2018 Monday
    [1] => 31/10/2018 Friday
    [2] => 30/09/2018 Wednesday
    [3] => 31/08/2018 Sunday
    [4] => 31/07/2018 Thursday
    [5] => 30/06/2018 Tuesday
    [6] => 31/05/2018 Saturday
    [7] => 30/04/2018 Thursday
    [8] => 31/03/2018 Monday
    [9] => 28/02/2018 Monday
    [10] => 31/01/2018 Friday
    [11] => 31/12/2017 Tuesday
)
于 2018-12-19T14:35:30.247 回答
1

您也可以使用strtotime()的零处理功能来实现此目的:

# Day Before
    echo date('Y-m-d', strtotime('2016-03-00')); // 2016-02-29

# Year can be handled too
    echo date('Y-m-d', strtotime('2016-01-00')); // 2015-12-31

# Month Before
    echo date('Y-m-d', strtotime('2016-00-01')); // 2015-12-01

# Month AND Day
    echo date('Y-m-d', strtotime('2016-00-00')); // 2015-11-30

如果您将 00 视为“比第一个 (01) 少一个”,那么这是有道理的。

所以为了达到这个问题的目的,“上个月的最后一天”是一个简单的例子

date('your_format', strtotime('YYYY-ThisMonth-00'));
# So:
date('Y-m-d', strtotime('2016-11-00')); // 2016-10-31
于 2016-11-26T21:57:28.703 回答