Получение даты прошлого месяца на php


85

Я хочу получить дату в прошлом месяце. Я написал это:

$prevmonth = date('M Y');

Что дает мне текущий месяц / год. Я не могу сказать , если я должен использовать strtotime, mktime. Что-то с меткой времени? Нужно ли мне добавлять что-то потом для сброса, чтобы дата не была установлена ​​на последний месяц во всем для всех временных меток на моем сайте? Я пытаюсь RTM, но мне трудно это понять.

Ответы:


212

Получить дату в прошлом месяце просто

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

3 ноября возвращается

2014-10-1
2014-10-31

7
Этот недостаточно хорош и может вызвать ошибки в вашем коде: $time = strtotime('2011-03-30 01:01:01'); echo date('r', strtotime('-1 month', $time));этот вернет среду, 02 марта 2011 01:01:01 - не февраль! Использовать strtotime('first day of previous month')вместо
Остин

@OzzyCzech Он возвращает 1 и 31 октября, если запускать 3 марта?
The Unknown Dev

$ data_day_str = strtotime («предыдущий месяц», strtotime ('2011-03-30 01:01:01')); Вы получите февраль 2011 года.
Родриго Серзеделло

32
echo strtotime("-1 month");

Это точно выведет метку времени за последний месяц. После этого ничего сбрасывать не нужно. Если после этого вы хотите, чтобы он был в английском формате, вы можете использовать date () для форматирования метки времени, то есть:

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

12
Сегодня 31 октября 2012 года. Date ("Ymd", strtotime ("- 1 месяц")); Возврат 2012-10-01. :(
Тодд

7
@toddsler Правильно. -1 месяц - это то же самое, что и -30 дней, которые в определенные дни в течение года либо пропускают 1 месяц, либо остаются в том же месяце, поэтому будьте осторожны с этим методом.
silkfire

НЕ ИСПОЛЬЗУЙТЕ ЭТО РЕШЕНИЕ! Предыдущие комментарии верны, у вас будут ошибки, которые будут появляться только 31-го числа месяца (или 29,30,31 марта)
Teenage

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

3
Это то же самое, что и date ('M Y', strtotime ("- 1 месяц")), если вы сделаете что-то вроде date ('M Y', strtotime ("2017-07-31 последний месяц")), он вернет 2017-07-01, так что будьте осторожны! date ('M Y', strtotime ('2017-07-31 первый день предыдущего месяца')) даст вам то, что вы хотите
Shadoweb

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). дата ("- Y"); => 02-2016. Если мы находимся в январе, он отвечает за 0 месяц этого года, а не за 12 месяцев прошлого года!
Tama

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-му числу месяца! Это даст вам 1-е число текущего месяца! См. Выше.
Shadoweb 01

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
Этот ответ неверен, если текущая дата - 31.03.2018. Деталь также похожа на это
Ngoc Nam

4

Нашел это неправильно, когда предыдущие месяцы короче текущего.

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

Попробуйте 30 марта, и вы получите 2012-03-01 вместо 2012-02 ...

В поисках лучшего решения ...


3
Это правильный ответ (-1 месяц работает не во всех случаях). Для предыдущего месяца используйте strtotime ("последний месяц").
Майк

1
Последний месяц или -1 месяц возвращает то же значение.
Etienne Dupuis

4
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

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 года. Работает по месяцу, день которого короче предыдущего месяца.


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 (марте), и мы хотим вычесть 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 марта 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 дня.
Taz

0

Если вы хотите получить первую дату предыдущего месяца, тогда вы можете использовать следующее ... $prevmonth = date('M Y 1', strtotime('-1 months'));что? первое свидание всегда будет 1: D


31 октября 2012 г. Возвращение 01.10.2012
Акира Ямамото

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! Вероятно, вам также следует подумать о том, чтобы объяснить, что происходит, если день 31и месяц не являются январем или августом (например, 2020 May 31становится 2020 April 31, что не существует)
xKobalt

php встроенная функция "date", обработайте ее.
SL-phpdeveloper
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.