Получение даты прошлого месяца на 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
OzzyЧешский
источник
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'));
Md. Maruf Hossain
источник
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 ...

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

Jay_69
источник
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

user2846324
источник
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

SL-phpdeveloper
источник
Добро пожаловать в StackOverflow! Вероятно, вам также следует подумать о том, чтобы объяснить, что происходит, если день 31и месяц не являются январем или августом (например, 2020 May 31становится 2020 April 31, что не существует)
xKobalt
php встроенная функция "date", обработайте ее.
SL-phpdeveloper