PHPで先月の日付を取得する


84

先月の日付が欲しいのですが。私はこれを書きました:

$prevmonth = date('M Y');

それは私に現在の月/年を与えます。私が使用する必要がある場合、私は言うことができませんstrtotimemktime。タイムスタンプに何かありますか?後でリセットするために何かを追加して、サイトのすべてのタイムスタンプのすべてで日付が先月に設定されないようにする必要がありますか?私はRTMをしようとしていますが、これを理解するのは難しいです。

回答:


208

先月の日付を取得するのは簡単です

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

11月3日に戻ります

2014-10-1
2014-10-31

7
これは十分ではなく、コードでエラーを引き起こす可能性があります。$time = strtotime('2011-03-30 01:01:01'); echo date('r', strtotime('-1 month', $time));これは2011年3月2日水曜日01:01:01を返します-2月ではありません!strtotime('first day of previous month')代わりに使用
Ostin 2013

@OzzyCzech 3月3日に実行すると、10月1日と31日が返されますか?
不明な開発者2015年

$ data_day_str = strtotime( "前月"、strtotime( '2011-03-30 01:01:01')); 2011
。– RodrigoSerzedello19年

31
echo strtotime("-1 month");

これにより、先月のタイムスタンプが正確に出力されます。後で何もリセットする必要はありません。その後、英語形式にしたい場合は、date()を使用してタイムスタンプをフォーマットできます。

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

12
今日は2012年10月31日です。date( "Ymd"、strtotime( "-1 month")); 2012-10-01を返します。:(
トッド

7
@toddsler正解です。-1か月は、-30日を書くのとまったく同じで、1年の特定の日付に1か月スキップするか、同じ月にとどまるため、この方法には注意してください。
Silkfire 2013年

このソリューションは使用しないでください。前のコメントが正しい、あなただけの月の31日の日にトリガされますエラーを持つことになります(または行進の29,30,31における)
ティーン

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

3
これはdate( 'M Y'、strtotime( "-1 month"))と同じですが、date( 'M Y'、strtotime( "2017-07-31先月"))のようなことをすると返されます2017-07-01なので、気をつけて!date( 'M Y'、strtotime( '2017-07-31前月の最初の日'))はあなたが望むものを与えるでしょう
Shadoweb 2017

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)を削除すると、賛成票を投じます。date( "-Y"); => 2016年2月。1月の場合、昨年の12か月ではなく、今年の0か月に回答します。
多摩

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 2017

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
現在の日付が2018/03/31の場合、この回答は正しくありません。詳細もこの
Ngoc Nam

4

前の月が現在より短い場合、これが間違っていることがわかりました。

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

3月30日に試してみると、2012-02ではなく2012-03-01が表示されます...

より良い解決策に取り組んでいます...


3
この答えは正しいです(-1か月はすべての場合に正しく機能するとは限りません)。前月には、strtotime( '先月')を使用します。
マイク

1
先月または-1か月は、同じ値を返します。
エティエンヌデュプイ2016年

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

1
以下のための文句を言わない作業2015-10-31PHP 5.5および5.6.11。を取得します201510-と同じ動作strtotime('- 1 month)
pmayer 2015年

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年12月です。前月よりも日が短い月で動作します。


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 2015

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);

2012年3月30日に動作します


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月(3月)にいて、5か月を差し引くと、次のようになります。

subtractMonth(3,5);

これは10(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

わたしにはできる:

今日は:2012年3月31日

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)%でのみ機能します。2月、4月、6月、9月、11月はどうですか?31日はありません。
タズ2012年

0

前月の初日を取得したい場合は、次のように使用できます...$prevmonth = date('M Y 1', strtotime('-1 months'));何?最初のデートは常に1:Dになります


10月31日、2012年を返し2012-10-01
山本

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へようこそ!おそらく、日が311月または8月ではない場合(に2020 May 31なる2020 April 31、存在しないなど)に何が起こるかを説明することも検討する必要があります
xKobalt

php組み込み関数「日付」、それを処理します。
SL-phpdeveloper
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.