2009-12-11 3 views
62

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

$prevmonth = date('M Y'); 

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

ответ

156

Это просто, чтобы получить последнюю дату МЕСЯЦ

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 
+6

Это не достаточно хорошо и может привести к ошибкам в вашем коде: '$ time = strtotime ('2011-03-30 01:01:01'); echo date ('r', strtotime ('- 1 month', $ time);' this one will return Wed, 02 Mar 2011 01:01:01 - не февраль! Используйте 'strtotime ('первый день предыдущего месяца')' вместо – Ostin

+0

у вас есть право, спасибо – OzzyCzech

+0

@OzzyCzech Он возвращает 1 и 31 октября, когда вы запускаете его 3 марта? –

24
echo strtotime("-1 month"); 

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

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

Сегодня 31 октября 2012 года дата ("Y-м-д", StrToTime ("- 1 месяц")); Возвращения 2012-10-01. :( – Todd

+7

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

1

О, я понял это, не обращайте внимания, если у вас такая же проблема, я сделал и в этом случае:

$prevmonth = date("M Y",mktime(0,0,0,date("m")-1,1,date("Y"))); 
19
$prevmonth = date('M Y', strtotime("last month")); 
+1

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

1

Вы можете использовать strtotime, который является большим в такого рода ситуациях:

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

вы получите:

string '2009-11' (length=7) 
5

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

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

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

Разработка на лучшее решение ...

+1

Этот ответ правильный (-1 месяц не будет работать должным образом во всех случаях). За предыдущий месяц используйте strtotime ('last month'). – Mike

+0

В прошлом месяце или -1 месяц возвращается одинаковое значение. –

4
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> 
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

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 
+0

Работает только в 58.3 (3)% случаев. Как насчет февраля, апреля, июня, сентября и ноября? У них нет 31 дня. – bostaf

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

Не работает для '2015-10-31' в PHP 5.5 и 5.6.11. Вы получите '201510' - то же поведение, что и с' strtotime ('- 1 month) '. – pmayer

0

Используйте этот короткий код, чтобы получить предыдущий месяц для любой заданной даты:

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

7

если вы хотите получить только предыдущий месяц, то вы можете использовать в качестве как следующий

$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')); 
+0

Будьте внимательны к 31-му месяцу! Это даст вам 1-го числа текущего месяца! См. Выше. – Shadowbob

0

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

0

Этот вопрос довольно старый, но здесь все равно. Если вы пытаетесь получить только за предыдущий месяц и день не имеет значения, вы можете использовать это:

$date = '2014-01-03'; 

$dateTime = new DateTime($date); 

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

echo $lastMonth; // 'December 2013' 
1
$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); 
+1

Хотя сам код может быть несколько понятным, полезно другим пользователям объяснить ваш ответ, а не просто давать код. – Turnerj

4

Неверные ответы:

$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')); => 03-2016 
echo $lastMonth = date('m-Y', strtotime("-1 month")); => 03-2016 

Правильный ответ будет:

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 
Смежные вопросы