Làm thế nào để tìm ngày cuối cùng của tháng kể từ ngày?


382

Làm thế nào tôi có thể có được ngày cuối cùng của tháng trong PHP?

Được:

$a_date = "2009-11-23"

Tôi muốn 2009-11-30; và được đưa ra

$a_date = "2009-12-23"

Tôi muốn 2009-12-31.

Câu trả lời:


805

ttrả về số ngày trong tháng của một ngày nhất định (xem tài liệu chodate ):

$a_date = "2009-11-23";
echo date("Y-m-t", strtotime($a_date));

99
Điều này sẽ thất bại sau năm 2038. Vì vậy, thay vì strtotime, nên sử dụng chức năng DateTime. Mã sau sẽ hoạt động mà không gặp sự cố Năm 2038: $ d = DateTime mới ('2009-11-23'); định dạng $ d-> ('Ymt');
Mugunth

74
@Mugunth Nếu bạn làm việc với ngày 24 năm trong tương lai, bạn có thể gặp sự cố sớm hơn năm 2038, tuy nhiên, các máy chủ đã chuyển sang kiến ​​trúc 64 bit sẽ cung cấp cho chúng tôi khoảng 292 tỷ năm để khắc phục sự cố.
Không có

1
trong thủ tục -> $ date1 = $ năm .'- '. $ tháng; $ d = date_create_from_format ('Y-m', $ date1); $ last_day = date_format ($ d, 't');
kayla

11
Với DateTimebạn có thể làm một cái gì đó như thế này:(new DateTime('2009-11-23'))->modify('last day of')
Victor

Nếu bạn đang sử dụng Carbon PHP, bạn có thể sử dụng daysInMonth getter
astroanu

119

Mã sử ​​dụng strtotime () sẽ thất bại sau năm 2038. (như được đưa ra trong câu trả lời đầu tiên trong chuỗi này) Ví dụ: hãy thử sử dụng như sau:

$a_date = "2040-11-23";
echo date("Y-m-t", strtotime($a_date));

Nó sẽ đưa ra câu trả lời là: 1970-01-31

Vì vậy, thay vì strtotime, nên sử dụng chức năng DateTime. Mã sau sẽ hoạt động mà không có vấn đề Năm 2038:

$d = new DateTime( '2040-11-23' ); 
echo $d->format( 'Y-m-t' );

17
Tôi sẽ 71 tuổi và đã nghỉ hưu sau đó, vì vậy không có vấn đề gì với tôi! j / k Nhưng nghiêm túc folks - chú ý cảnh báo này!
Volomike

17
Điều này giả định rằng bạn đang chạy phiên bản PHP 32 bit.
Không có

Tại sao sự thật đáng báo động này về strtotime không được đề cập trong php docu php.net/manual/de/feft.strtotime.php ?
Adam

1
@Adam Bây giờ, không chắc là khi bạn kiểm tra. php.net/manual/de/ từ
Mave

1
Kể từ năm 2018, strtotimemã cho tôi kết quả này: 2040-11-30
Jee

104

Tôi biết điều này hơi muộn một chút nhưng tôi nghĩ có một cách thanh lịch hơn để làm điều này PHP 5.3+bằng cách sử dụng lớp DateTime :

$date = new DateTime('now');
$date->modify('last day of this month');
echo $date->format('Y-m-d');

20
Trong một dòng: $ date = DateTime mới ('ngày cuối cùng của tháng này');
Harold

6
Bạn có thể muốn thêm $ date-> sửa đổi ('ngày cuối cùng của tháng này') -> setTime (23,59,59); nếu bạn muốn sử dụng dateTime này để so sánh khi thời gian quan trọng. (Điều này mang lại cho bạn giây cuối cùng của tháng)
omgitsdrobinoha

5
Điều này hoạt động:$date = new DateTime('last day of 2020-2');

4
@ John bạn sai rồi. ngày cuối cùng được tính bằng cách sử dụng đối tượng $ date chứ không phải ngày hệ thống. Hãy thử nó bằng cách thay đổi dòng đầu tiên với điều này:$date = DateTime::createFromFormat('m/d/Y', '1/10/2014');
Hannoun Yassir

5
Nếu bạn đã suy nghĩ hoặc ít nhất hãy thử những gì tôi yêu cầu bạn làm, bạn sẽ thấy rằng tháng này có nghĩa là giá trị của tháng trong đối tượng DateTime chứ không phải ngày của hệ thống. Nếu bạn không thể nhập / chạy mã php, điều này có thể giúp ích: sandbox.onlinephpfifts.com/code/iêu
Hannoun Yassir

76

Ngoài ra còn có hàm PHP tích hợp cal_days_in_month () ?

"Hàm này sẽ trả về số ngày trong tháng của năm cho lịch được chỉ định." http://php.net/manual/en/feft.cal-days-in-month .

echo cal_days_in_month(CAL_GREGORIAN, 11, 2009); 
// = 30

2
Câu trả lời này đơn giản và phù hợp hơn nhiều so với việc sử dụng strtoTime. Tôi không thấy bất kỳ nhược điểm nào. Đến đầu bạn đi.
Tomas Zubiri

Đây phải là câu trả lời được chấp nhận.
sieppl

24

Điều này sẽ làm việc:

$week_start = strtotime('last Sunday', time());
$week_end = strtotime('next Sunday', time());

$month_start = strtotime('first day of this month', time());
$month_end = strtotime('last day of this month', time());

$year_start = strtotime('first day of January', time());
$year_end = strtotime('last day of December', time());

echo date('D, M jS Y', $week_start).'<br/>';
echo date('D, M jS Y', $week_end).'<br/>';

echo date('D, M jS Y', $month_start).'<br/>';
echo date('D, M jS Y', $month_end).'<br/>';

echo date('D, M jS Y', $year_start).'<br/>';
echo date('D, M jS Y', $year_end).'<br/>';

18

Điều gì là sai - Thanh lịch nhất đối với tôi là sử dụng DateTime

Tôi tự hỏi tôi không nhìn thấy DateTime::createFromFormat, một lót

$lastDay = \DateTime::createFromFormat("Y-m-d", "2009-11-23")->format("Y-m-t");

2
Tôi đồng ý. Giải pháp này (lớp DateTime) tốt hơn nhiều so với việc sử dụng các hàm datetime cũ.
schellingerht

17

Bạn có thể tạo một ngày cho ngày đầu tiên của tháng tiếp theo, sau đó sử dụng strtotime("-1 day", $firstOfNextMonth)


một phương pháp khác sử dụng phương pháp tương tự là cung cấp cho mktime ngày thứ 0 của tháng tiếp theomktime(0, 0, 0, $month+1, 0, $year);
George

Đối với tôi, việc sử dụng strtotime()mktime()được khuyến khích bởi bec. các lỗi đã biết như xác định ngày ở rìa của các tháng và các bước tính toán năm nhuận. Vì DateTimecó sẵn, bạn nên sử dụng lớp này để tránh mọi vấn đề trong tương lai. Giống như đã nói nhiều lần trước tôi, cả hai chức năng này strtotime()mktime()sẽ thất bại sau năm 2038. Đó là lý do tại sao tôi hạ cấp ...
Paul T. Rawkeen

@ PaulT.Rawkeen Câu trả lời này đã hơn 4 tuổi. Như với bất cứ điều gì trên internet, tuổi tác nên là một yếu tố khi đánh giá mức độ phù hợp và hữu ích. Hơn nữa, IMHO, thời gian giảm một nửa cho bất cứ điều gì liên quan đến công nghệ là đặc biệt ngắn.
nikc.org

@ nikc.org Tôi đồng ý, đặc biệt là về thời gian sống cho tất cả các giải pháp kỹ thuật và cách giải quyết vấn đề. Trong trường hợp cụ thể này, câu trả lời có số lượng upvote tương đối tốt và có lẽ, ai đó ( lập trình viên cơ sở ) sẽ coi câu trả lời này là giải pháp chấp nhận được. nó ngắn và tao nhã :) và anh ta có thể sẽ nhận được kết quả như mong đợi, nhưng khi thời gian trôi qua, cách giải quyết vấn đề như vậy trở nên khó khăn và chúng ta nên cảnh báo về những sự thật như vậy khi có thể. Trân trọng .
Paul T. Rawkeen

16

Hãy thử điều này, nếu bạn đang sử dụng PHP 5.3+,

$a_date = "2009-11-23";
$date = new DateTime($a_date);
$date->modify('last day of this month');
echo $date->format('Y-m-d');

Để tìm tháng tiếp theo vào ngày cuối cùng, hãy sửa đổi như sau,

 $date->modify('last day of 1 month');
 echo $date->format('Y-m-d');

và như thế..


11

Giải pháp của bạn là đây ..

$lastday = date('t',strtotime('today'));

1
Điều này mang lại 31cho Septembernhững gì bạn biết là không chính xác.
Iliyass Hamza

10

Bạn có thể tìm thấy ngày cuối cùng của tháng một vài cách. Nhưng đơn giản là bạn có thể làm điều này bằng cách sử dụng hàm strtotime ()date () của PHP. Tôi tưởng tượng mã cuối cùng của bạn sẽ trông giống như thế này:

$a_date = "2009-11-23";
echo date('Y-m-t',strtotime($a_date));

Bản thử trực tiếp

Nhưng nếu bạn đang sử dụng PHP> = 5.2 Tôi thực sự khuyên bạn nên sử dụng đối tượng DateTime mới. Ví dụ như dưới đây:

$a_date = "2009-11-23";
$date = new DateTime($a_date);
$date->modify('last day of this month');
echo $date->format('Y-m-d');

Bản thử trực tiếp

Ngoài ra, bạn có thể giải quyết điều này bằng cách sử dụng chức năng của riêng bạn như dưới đây:

/**
 * Last date of a month of a year
 *
 * @param[in] $date - Integer. Default = Current Month
 *
 * @return Last date of the month and year in yyyy-mm-dd format
 */
function last_day_of_the_month($date = '')
{
    $month  = date('m', strtotime($date));
    $year   = date('Y', strtotime($date));
    $result = strtotime("{$year}-{$month}-01");
    $result = strtotime('-1 second', strtotime('+1 month', $result));

    return date('Y-m-d', $result);
}

$a_date = "2009-11-23";
echo last_day_of_the_month($a_date);

Cảm ơn chức năng của bạn, nó hoạt động như tôi mong đợi :)
Mankeomorakort

7

Nếu bạn sử dụng tiện ích mở rộng API Carbon cho PHP DateTime, bạn có thể nhận được ngày cuối cùng của tháng với:

$date = Carbon::now();
$date->addMonth();
$date->day = 0;
echo $date->toDateString(); // use toDateTimeString() to get date and time 

Trên thực tế, nếu bạn đặt ngày thành -1, nó sẽ nhận được ngày cuối cùng nhưng một. Vì vậy, bạn phải đặt ngày về 0 để có được ngày cuối cùng. $date->day = 0;
Jacanne Afonso

cảm ơn bạn @GiovanneAfonso là chính xác. Tôi đặt ngày là 0 và kiểm tra câu trả lời.
eaykin

1
Nếu bạn đang sử dụng Carbon, cách tiếp cận một lớp là sử dụng: Carbon :: Now () -> endOfMonth (). Tuy nhiên, endOfMonth () là một công cụ sửa đổi, vì vậy hãy sử dụng "bản sao" nếu bạn có một biến hiện có giữ ngày Carbon (hoặc ngày sẽ được sửa đổi).
Charlie Dalsass

4

Bạn cũng có thể sử dụng nó với datetime

$date = new \DateTime();
$nbrDay = $date->format('t');
$lastDay = $date->format('Y-m-t');

4
$date1 = $year.'-'.$month; 
$d = date_create_from_format('Y-m',$date1); 
$last_day = date_format($d, 't');


2

Nếu bạn có một tháng khôn ngoan thì hãy lấy ngày cuối cùng của tháng sau đó,

public function getLastDateOfMonth($month)
    {
        $date = date('Y').'-'.$month.'-01';  //make date of month 
        return date('t', strtotime($date)); 
    }

$this->getLastDateOfMonth(01); //31

1

Đây là một chức năng hoàn chỉnh:

public function get_number_of_days_in_month($month, $year) {
    // Using first day of the month, it doesn't really matter
    $date = $year."-".$month."-1";
    return date("t", strtotime($date));
}

Điều này sẽ xuất ra sau:

echo get_number_of_days_in_month(2,2014);

Đầu ra: 28


1

Có nhiều cách để có được ngày cuối cùng của tháng.

//to get last day of current month
echo date("t", strtotime('now'));

//to get last day from specific date
$date = "2014-07-24";
echo date("t", strtotime($date));

//to get last day from specific date by calendar
$date = "2014-07-24";
$dateArr=explode('-',$date);
echo cal_days_in_month(CAL_GREGORIAN, $dateArr[1], $dateArr[0]); 

1

Tôi đến trễ nhưng có một số cách dễ dàng để làm điều này như đã đề cập:

$days = date("t");
$days = cal_days_in_month(CAL_GREGORIAN, date('m'), date('Y'));
$days = date("j",mktime (date("H"),date("i"),date("s"),(date("n")+1),0,date("Y")));

Sử dụng mktime () là cách tôi kiểm soát hoàn toàn mọi khía cạnh của thời gian ... IE

echo "<br> ".date("Y-n-j",mktime (date("H"),date("i"),date("s"),(11+1),0,2009));

Đặt ngày thành 0 và di chuyển tháng của bạn lên 1 sẽ cho bạn ngày cuối cùng của tháng trước. 0 và số âm có ảnh hưởng tương tự trong các đối số khác nhau. PHP: mktime - Hướng dẫn

Như một số người đã nói rằng strtotime không phải là cách đi vững chắc nhất và rất ít nếu không có cách nào dễ dàng linh hoạt.


1

Tôi đang sử dụng strtotime với cal_days_in_month như sau:

$date_at_last_of_month=date('Y-m-d', strtotime('2020-4-1
+'.(cal_days_in_month(CAL_GREGORIAN,4,2020)-1).' day'));


0

Một cách khác sử dụng mktime và không phải ngày ('t'):

$dateStart= date("Y-m-d", mktime(0, 0, 0, 10, 1, 2016)); //2016-10-01
$dateEnd = date("Y-m-d", mktime(0, 0, 0, 11, 0, 2016)); //This will return the last day of october, 2016-10-31 :)

Vì vậy, cách này sẽ tính toán nếu nó là 31,30 hoặc 29


0

Phần mở rộng API carbon cho PHP DateTime

Carbon::parse("2009-11-23")->lastOfMonth()->day;

hoặc là

Carbon::createFromDate(2009, 11, 23)->lastOfMonth()->day;

sẽ trở lại

30

-1
function first_last_day($string, $first_last, $format) {
    $result = strtotime($string);
    $year = date('Y',$result);
    $month = date('m',$result);
    $result = strtotime("{$year}-{$month}-01");
    if ($first_last == 'last'){$result = strtotime('-1 second', strtotime('+1 month', $result)); }
    if ($format == 'unix'){return $result; }
    if ($format == 'standard'){return date('Y-m-d', $result); }
}

http://zkinformer.com/?p=134


-2

Đây là một cách thanh lịch hơn nhiều để có được cuối tháng:

  $thedate = Date('m/d/Y'); 
  $lastDayOfMOnth = date('d', mktime(0,0,0, date('m', strtotime($thedate))+1, 0, date('Y', strtotime($thedate)))); 

-3

Bạn có thể sử dụng " t" trong chức năng ngày để lấy số ngày trong một tháng cụ thể.

Mã sẽ giống như thế này:

function lastDateOfMonth($Month, $Year=-1) {
    if ($Year < 0) $Year = 0+date("Y");
    $aMonth         = mktime(0, 0, 0, $Month, 1, $Year);
    $NumOfDay       = 0+date("t", $aMonth);
    $LastDayOfMonth = mktime(0, 0, 0, $Month, $NumOfDay, $Year);
    return $LastDayOfMonth;
}

for($Month = 1; $Month <= 12; $Month++)
    echo date("Y-n-j", lastDateOfMonth($Month))."\n";

Các mã là tự giải thích. Vì vậy, hy vọng nó sẽ giúp.

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.