Nhận ngày tháng trước bằng php


84

Tôi muốn biết ngày tháng trước. Tôi đã viết điều này ra:

$prevmonth = date('M Y');

Cho tôi tháng / năm hiện tại. Tôi không thể biết nếu tôi nên sử dụng strtotime, mktime. Một cái gì đó đến dấu thời gian? Tôi có cần thêm thứ gì đó sau đó để đặt lại sao cho ngày không được đặt thành tháng trước trong suốt mọi thứ cho tất cả các dấu thời gian trên trang web của mình không? Tôi đang cố gắng RTM nhưng thật khó cho tôi để tìm ra điều này.

Câu trả lời:


208

Thật đơn giản để có được ngày tháng trước

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

vào ngày 3 tháng 11 trở lại

2014-10-1
2014-10-31

7
Cái này không đủ tốt và có thể gây ra lỗi trong mã của bạn: $time = strtotime('2011-03-30 01:01:01'); echo date('r', strtotime('-1 month', $time));cái này sẽ trả lại vào Thứ 4, ngày 02 tháng 3 năm 2011 01:01:01 - không phải tháng 2! Sử dụng strtotime('first day of previous month')thay thế
Ostin

@OzzyCzech Nó trả về ngày 1 và 31 tháng 10 khi bạn chạy nó vào ngày 3 tháng 3?
The Unknown Dev

$ data_day_str = strtotime ("tháng trước", strtotime ('2011-03-30 01:01:01')); Bạn sẽ nhận được vào tháng 2 năm 2011.
Rodrigo Serzedello

31
echo strtotime("-1 month");

Điều đó sẽ xuất ra chính xác dấu thời gian cho tháng trước. Bạn không cần phải thiết lập lại bất kỳ thứ gì sau đó. Nếu bạn muốn nó ở định dạng tiếng Anh sau đó, bạn có thể sử dụng date () để định dạng dấu thời gian, tức là:

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

12
Hôm nay là ngày 31 tháng 10 năm 2012. date ("Ymd", strtotime ("- 1 tháng")); Trả về 2012-10-01. :(
Todd

7
@toddsler Đúng. -1 tháng cũng giống như viết -30 ngày mà vào những ngày nhất định trong năm sẽ bỏ qua 1 tháng hoặc giữ nguyên trong tháng, vì vậy hãy cẩn thận với phương pháp này.
silkfire

KHÔNG SỬ DỤNG GIẢI PHÁP NÀY! Nhận xét trước là đúng, bạn sẽ có lỗi chỉ được kích hoạt vào ngày 31 của tháng (hoặc 29,30,31 của tháng 3)
Thanh thiếu niên

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

3
Điều này cũng giống như date ('M Y', strtotime ("- 1 tháng")), nếu bạn làm điều gì đó như date ('M Y', strtotime ("2017-07-31 tháng trước")) thì nó sẽ trả về 2017-07-01, vì vậy hãy cẩn thận! date ('M Y', strtotime ('2017-07-31 ngày đầu tiên của tháng trước')) sẽ cung cấp cho bạn những gì bạn muốn
Shadoweb

12

Câu trả lời không chính xác là:

$lastMonth = date('M Y', strtotime("-1 month"));
$lastDate = date('Y-m', strtotime('last month'));

Lý do là nếu tháng hiện tại là 30 ngày trở lên nhưng tháng trước là 29 và ít hơn $ LastMonth sẽ giống với tháng hiện tại.

ví dụ

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

Câu trả lời chính xác sẽ là:

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
Tôi sẽ ủng hộ nếu bạn loại bỏ echo sprintf ("% 02d", date ("m") - 1). ngày ("- Y"); => Tháng 02-2016. Nếu chúng ta đang ở trong tháng Giêng, nó trả lời là tháng 0 của năm nay, không phải 12 của năm ngoái!
Tama,

6

nếu bạn chỉ muốn nhận được tháng trước, thì bạn có thể sử dụng như sau

$prevmonth = date('M Y', strtotime('-1 months'));

nếu bạn muốn lấy những ngày tương tự của tháng trước, thì bạn có thể sử dụng như sau ..

$prevmonth = date('M Y d', strtotime('-1 months'));

nếu bạn muốn lấy ngày cuối cùng của tháng trước, thì bạn có thể sử dụng như sau ...

$prevmonth = date('M Y t', strtotime('-1 months'));

nếu bạn muốn lấy ngày đầu tiên của tháng trước, thì bạn có thể sử dụng như sau ...

$prevmonth = date('M Y 1', strtotime('-1 months'));

3
Hãy cẩn thận cho ngày 31 của tháng! Nó sẽ cung cấp cho bạn ngày đầu tiên của tháng hiện tại! Xem ở trên.
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
Câu trả lời này không chính xác khi ngày hiện tại là 2018/03/31. Chi tiết cũng như thế này
Ngọc Nam

4

Tìm thấy điều này sai khi các tháng trước đó ngắn hơn hiện tại.

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

Hãy thử vào ngày 30 tháng 3 và bạn sẽ nhận được 2012-03-01 thay vì 2012-02 ...

Đang tìm ra giải pháp tốt hơn ...


3
Câu trả lời này đúng (-1 tháng sẽ không hoạt động bình thường trong mọi trường hợp). Đối với tháng trước, hãy sử dụng strtotime ('tháng trước').
Mike

1
Tháng trước hoặc tháng -1 trả về cùng một giá trị.
Etienne Dupuis

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

1
Không hoạt động đối với 2015-10-31PHP 5.5 và 5.6.11. Bạn sẽ nhận được 201510- hành vi tương tự như với strtotime('- 1 month).
pmayer

2

Sử dụng mã ngắn này để nhận tháng trước cho bất kỳ ngày cụ thể nào:

$tgl = '25 january 2012';

$prevmonth = date("M Y",mktime(0,0,0,date("m", strtotime($tgl))-1,1,date("Y", strtotime($tgl))));
echo $prevmonth;

Kết quả là tháng 12 năm 2011. Hoạt động vào một tháng có ngày ngắn hơn so với tháng trước.


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
Mặc dù bản thân mã có thể hơi tự giải thích, nhưng sẽ rất hữu ích cho những người dùng khác giải thích câu trả lời của bạn thay vì chỉ đưa ra mã.
Turnerj

1

Bạn có thể sử dụng strtotime, điều này rất tốt trong các tình huống này:

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

Sẽ có em :

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

HOẶC LÀ

$lastMonth = date("m-Y", mktime() - 31*3600*24);

hoạt động vào ngày 30.03.2012


1

Ồ, tôi đã hiểu ra điều này, vui lòng bỏ qua trừ khi bạn gặp vấn đề tương tự như tôi đã làm trong trường hợp đó:

$prevmonth = date("M Y",mktime(0,0,0,date("m")-1,1,date("Y")));

1

Giải pháp tốt nhất mà tôi đã tìm thấy là:

function subtracMonth($currentMonth, $monthsToSubtract){
        $finalMonth = $currentMonth;
        for($i=0;$i<$monthsToSubtract;$i++) {
            $finalMonth--;
            if ($finalMonth=='0'){
                $finalMonth = '12';
            }

        }
        return $finalMonth;

    }

Vì vậy, nếu chúng ta đang ở 3 (tháng 3) và chúng ta muốn trừ đi 5 tháng thì

subtractMonth(3,5);

sẽ cho 10 (tháng 10). Nếu năm cũng được mong muốn, người ta có thể làm điều này:

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

Nó hoạt động cho tôi:

Hôm nay là: 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

Trong chỉ hoạt động trong 58,3 (3)% trường hợp. Còn tháng 2, 4, 6, 9, 11 thì sao? Họ không có 31 ngày.
Taz

0

Nếu bạn muốn lấy ngày đầu tiên của tháng trước, thì bạn có thể sử dụng như sau ... $prevmonth = date('M Y 1', strtotime('-1 months'));gì? ngày đầu tiên sẽ luôn là 1: D


Ngày 31 tháng 10 năm 2012. Trả lại 2012-10-01
Akira Yamamoto

0

Câu hỏi này khá cũ nhưng dù sao thì ở đây vẫn tiếp tục. Nếu bạn đang cố gắng chỉ lấy tháng trước và ngày không quan trọng, bạn có thể sử dụng điều này:

$date = '2014-01-03';

$dateTime = new DateTime($date);

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

echo $lastMonth; // 'December 2013'

0

Đơn giản chỉ cần lấy tháng trước.

Thí dụ:

Hôm nay là: 2020-09-02

Mã:

echo date('Y-m-d', strtotime(date('Y-m-d')." -1 month"));

Kết quả:

2020-08-02


Chào mừng bạn đến với StackOverflow! Có lẽ, bạn cũng nên xem xét để giải thích điều gì sẽ xảy ra nếu ngày đó 31và tháng không phải là tháng 1 hoặc tháng 8 (giống như 2020 May 31trở thành 2020 April 31, điều đó không tồn tại)
xKobalt

hàm nội trang php "date", xử lý nó.
SL-phpdeveloper
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.