Отримання дати минулого місяця у php


84

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

$prevmonth = date('M Y');

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

Відповіді:


208

Отримати дату минулого місяця просто

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 року.
Родріго Серзеделло

31
echo strtotime("-1 month");

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

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

12
Сьогодні 31 жовтня 2012 р. Дата ("Ymd", strtotime ("- 1 місяць")); Повертається 01.10.2012. :(
Тодд,

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

НЕ ВИКОРИСТОВУЙТЕ ЦЕ РІШЕННЯ! Попередні коментарі правильні, у вас будуть помилки, які будуть спричинені лише 31 числа місяця (або 29,30,31 березня)
Підлітковий

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

3
Це те саме, що дата ('M Y', strtotime ("- 1 місяць")), якщо ви зробите щось на зразок дати ('M Y', strtotime ("2017-07-31 останній місяць")), вона повернеться 01.07.2017, тож будьте обережні! date ('M Y', strtotime ('31.07.2017 перший день попереднього місяця')) дасть вам те, що ви хочете
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", дата ("m") - 1). дата ("- 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 числа! Це дасть вам 1-го числа поточного місяця! Дивись вище.
Shadoweb

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. Деталь також , як це
Нгок Нам

4

Знайшов це неправильно, коли попередні місяці коротші за поточні.

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

Спробуйте 30 березня, і ви отримаєте 2012-03-01 замість 2012-02 ...

Розробка кращого рішення ...


3
Ця відповідь правильна (-1 місяць не буде працювати належним чином у всіх випадках). Для попереднього місяця використовуйте strtotime ('останній місяць').
Mike

1
Минулий місяць або -1 місяць повертає те саме значення.
Етьєн Дюпюї

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

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.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 дня.
Таз

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 вбудована функція "дата", обробляйте це.
SL-phpdeveloper
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.