รับวันที่ของเดือนที่แล้วใน php


87

ฉันต้องการรับวันที่ของเดือนที่แล้ว ฉันเขียนสิ่งนี้:

$prevmonth = date('M Y');

ซึ่งทำให้ฉันเป็นเดือน / ปีปัจจุบัน ฉันไม่สามารถบอกได้ว่าควรใช้strtotimeหรือmktimeไม่ สิ่งที่จะประทับเวลา? ฉันต้องเพิ่มบางอย่างในภายหลังเพื่อรีเซ็ตเพื่อไม่ให้วันที่ตั้งเป็นเดือนที่แล้วตลอดทุกอย่างสำหรับการประทับเวลาทั้งหมดบนไซต์ของฉันหรือไม่ ฉันกำลังพยายาม RTM แต่มันยากสำหรับฉันที่จะคิดออก

คำตอบ:


213

ง่ายมากที่จะได้รับวันที่ของเดือนที่แล้ว

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 มี.ค. 2554 01:01:01 น. - ไม่ใช่กุมภาพันธ์! ใช้strtotime('first day of previous month')แทน
Ostin

@OzzyCzech จะคืนวันที่ 1 และ 31 ตุลาคมเมื่อคุณเรียกใช้ในวันที่ 3 มีนาคม?
The Unknown Dev

$ data_day_str = strtotime ("เดือนก่อนหน้า", strtotime ('2011-03-30 01:01:01')); คุณจะได้รับเดือนกุมภาพันธ์ 2011
Rodrigo Serzedello

33
echo strtotime("-1 month");

ซึ่งจะแสดงการประทับเวลาของเดือนที่แล้วอย่างแน่นอน คุณไม่จำเป็นต้องรีเซ็ตอะไรในภายหลัง หากคุณต้องการในรูปแบบภาษาอังกฤษหลังจากนั้นคุณสามารถใช้date ()เพื่อจัดรูปแบบการประทับเวลาได้เช่น:

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

12
วันนี้คือวันที่ 31 ตุลาคม 2555 วันที่ ("Ymd", strtotime ("- 1 เดือน")); ส่งคืน 2012-10-01 :(
ทอดด์

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 เดือนที่แล้ว")) มันจะกลับมา 2017-07-01 จึงควรระวัง! วันที่ ('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-2559. ถ้าเราอยู่ในเดือนมกราคมจะตอบเดือน 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

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 รายละเอียดเช่นนี้
หง็อกน้ำ

5

พบว่าสิ่งนี้ผิดเมื่อเดือนก่อนหน้าสั้นกว่าปัจจุบัน

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

ลองใช้วันที่ 30 มีนาคมและคุณจะได้รับ 2012-03-01 แทนที่จะเป็น 2012-02 ...

หาทางออกที่ดีกว่า ...


3
คำตอบนี้ถูกต้อง (-1 เดือนใช้ไม่ได้ในทุกกรณี) สำหรับเดือนก่อนหน้าให้ใช้ strtotime ('เดือนที่แล้ว')
Mike

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;

ผลลัพธ์คือธันวาคม 2554 ทำงานในเดือนที่มีวันสั้นกว่ากับเดือนก่อนหน้า


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
$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 วัน
Taz

0

ถ้าอยากได้วันแรกของเดือนก่อนหน้าก็ใช้ตามนี้ ... $prevmonth = date('M Y 1', strtotime('-1 months'));อะไรนะ? เดทแรกจะเป็น 1 เสมอ: D


31 ตุลาคม 2555 ย้อนกลับ 2012-10-01
Akira Yamamoto

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 builtin ฟังก์ชั่น "วันที่" จัดการมัน
SL-phpdeveloper
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.