2009-11-22 68 views

Trả lời

28

Lấy tháng hiện tại và năm:

$curMonth = date('n'); 
$curYear = date('Y'); 

Tạo một dấu thời gian cho 0:00 vào ngày đầu tiên của tháng tiếp theo:

if ($curMonth == 12) 
    $firstDayNextMonth = mktime(0, 0, 0, 0, 0, $curYear+1); 
else 
    $firstDayNextMonth = mktime(0, 0, 0, $curMonth+1, 1); 

Số ngày đến khi ngày đó là số của giây giữa bây giờ và sau đó chia cho (24 * 60 * 60).

$daysTilNextMonth = ($firstDayNextMonth - mktime())/(24 * 3600); 

Edit: Có bạn đi, tinh chỉnh để tính đến tháng Mười Hai. Phương pháp này là an toàn năm nhuận.

+0

tôi nhận được 29.895185185185, khi tôi thử này –

+0

Đã chỉnh sửa; thử ngay bây giờ. Ngoài ra, bạn có thể muốn làm tròn xuống số nguyên gần nhất với 'tầng()'. –

+2

thats tuyệt vời, cảm ơn bạn rất nhiều sir: –

-3

Bạn có thể sử dụng phương pháp ngày php để tìm ra tháng hiện tại và ngày, và sau đó bạn sẽ cần phải có một danh sách ngắn để tìm bao nhiêu ngày trong tháng đó và trừ (năm nhuận sẽ yêu cầu thêm công việc).

+0

omg, không có cách nào ngắn để thực hiện việc này? :) –

+5

Bạn không làm gì với bài đăng này ngoài giải thích mức độ khó thực hiện mục tiêu. Lần tới, hữu ích hơn hoặc không đăng bài. – mattbasta

1

Bạn có thể lấy đầu của tháng tiếp theo với điều này:

$now = getdate(); 
$nextmonth = ($now['mon'] + 1) % 13 + 1; 
$year = $now['year']; 
if($nextmonth == 1) 
    $year++; 
$thefirst = gmmktime(0, 0, 0, $nextmonth, $year); 

Với ví dụ này, $thefirst sẽ là dấu thời gian UNIX cho là người đầu tiên của tháng tiếp theo. Sử dụng date để định dạng theo ý thích của bạn.

này sẽ cung cấp cho bạn những ngày còn lại trong tháng:

$now = getdate(); 
$months = array(
    31, 
    28 + ($now['year'] % 4 == 0 ? 1 : 0), // Support for leap years! 
    31, 
    30, 
    31, 
    30, 
    31, 
    31, 
    30, 
    31, 
    30, 
    31 
); 
$days = $months[$now['mon'] - 1]; 
$daysleft = $days - $now['mday']; 

Số ngày còn lại sẽ được lưu trữ trong $daysleft.

Hy vọng điều này sẽ hữu ích!

+0

xin cảm ơn! –

5

Cách dễ nhất và nhanh nhất là sử dụng strtotime() ghi nhận 'ngày đầu tiên vào tháng tới';

$firstDayNextMonth = date('Y-m-d', strtotime('first day next month')); 
+1

Điều này có thể xảy ra trong một số trường hợp, p.e. thử kết quả này vào ngày hôm nay ('2012-11-30') cho' 2012-12-31'. Có thể an toàn hơn khi thực hiện nó như sau: '$ firstDayNextMonth = date ('Y-m-01', strtotime ('tháng tiếp theo'));' – Bjoern

+4

@Bjoern Điều đó xảy ra khi bạn viết '' ngày đầu tiên vào tháng tới ''. Nó phải là '' ngày đầu tiên của tháng tiếp theo '' và mọi thứ sẽ hoạt động như mong đợi. – Ronnie

+0

Cũng hoạt động với các tháng sau: 'strtotime ('ngày đầu tiên của tháng + 2')' – Peter

1

$firstDayNextMonth = date('Y-m-d', mktime(0, 0, 0, date('m')+1, 1, date('Y')));

0

tôi đã tiếp cận mattbasta vì nó có thể để có được những 'ngày đầu tiên của tháng tiếp theo' với một ngày nhất định, nhưng có một vấn đề nhỏ trong việc tính $ nextmonth. Việc sửa chữa như sau:

$now = getdate(); 
$nextmonth = ($now['mon'] + 1) % 13 + 1; 
$year = $now['year']; 
if($nextmonth == 1) 
    $year++; 
else 
    $nextmonth--; 
$thefirst = gmmktime(0, 0, 0, $nextmonth, $year); 
33
$firstDayNextMonth = date('Y-m-d', strtotime('first day of next month')); 

Để nhận được ngày đầu tiên sau hai tháng kể từ hiện tại

$firstDayAfterTwoMonths = date('Y-m-d', strtotime('first day of +2 month')); 
+2

Cũng hoạt động với các tháng tiếp theo: 'strtotime ('ngày đầu tiên của tháng + 2')' – Peter

2

Vì tôi googled này và đến câu trả lời này, tôi figured tôi muốn bao gồm hơn câu trả lời hiện đại hoạt động cho PHP 5.3.0+.

//Your starting date as DateTime 
$currentDate = new DateTime(date('Y-m-d')); 

//Add 1 month 
$currentDate->add(new DateInterval('P1M')); 

//Get the first day of the next month as string 
$firstDayOfNextMonth = $currentDate->format('Y-m-1'); 
5

Bạn có thể sử dụng đối tượng DateTime như thế này để tìm hiểu ngày đầu tiên của tháng tiếp theo như thế này:

$date = new DateTime('first day of next month'); 

Bạn có thể làm điều này để biết có bao nhiêu ngày còn lại từ nay đến ngày đầu tiên của tháng tiếp theo:

$date = new DateTime('now'); 
$nowTimestamp = $date->getTimestamp(); 
$date->modify('first day of next month'); 
$firstDayOfNextMonthTimestamp = $date->getTimestamp(); 
echo ($firstDayOfNextMonthTimestamp - $nowTimestamp)/86400; 
+0

Đây phải là câu trả lời. +1 –

0

tôi ban đầu nghĩ về việc sử dụng một đối tượng DateInterval (như đã trình bày ở trên trong câu trả lời khác) nhưng nó là không đáng tin cậy . Ví dụ, nếu DateTime hiện tại là 31 tháng 1 và sau đó chúng tôi thêm vào một tháng (để có được tháng tiếp theo) thì nó sẽ bỏ qua hoàn toàn vào tháng 2!

Đây là giải pháp của tôi:

function start_of_next_month(DateTime $datetime) 
{ 
    $year = (int) $datetime->format('Y'); 
    $month = (int) $datetime->format('n'); 
    $month += 1; 

    if ($month === 13) 
    { 
     $month = 1; 
     $year += 1; 
    } 

    return new DateTime($year . '-' . $month . '-01'); 
} 
1

Như một poster đã đề cập đến đối tượng DateInterval không cho kết quả chính xác cho tháng tiếp theo khi bạn sử dụng ngày như 2016/01/31 hoặc 2016/08/31 khi nó bỏ qua tháng tiếp theo. Giải pháp của tôi là vẫn sử dụng đối tượng DateInterval nhưng định dạng lại ngày hiện tại của bạn thành ngày đầu tiên của tháng hiện tại trước khi sử dụng DateInterval.

$currentDate = '8/31/2016'; 
$date = new DateTime(date("n", strtotime($currentDate))."/1/".date("Y", strtotime($currentDate))); 
//add 1 month 
$date->add(new DateInterval('P1M')); 
$currentDate=$date->format('m/1/Y'); 

echo($currentDate); 
0

Cách dễ nhất để có được những ngày cuối cùng của tháng

date('Y-m-d', mktime(0, 0, 0, date('m')+1, 1, date('Y'))); 
0

Ngay cả cách dễ dàng hơn để có được ngày đầu tiên và cuối cùng của tháng tiếp theo

$first = strttotime("first day of next month"); 
$last = strttotime("last day of next month"); 
+3

Vui lòng giải thích thêm về câu trả lời của bạn. Chỉ đăng một đoạn mã là không đủ. Bạn có thể đọc thêm về các câu trả lời có chất lượng tốt tại đây: http://stackoverflow.com/help/how-to-answer – jakubbialkowski

+0

Vui lòng giải thích câu trả lời của bạn để mã của bạn dễ hiểu hơn – acostela

0

Bạn có thể làm một cái gì đó như thế này. Để có chức năng này, bạn cần sử dụng thư viện php có sẵn trong https://packagist.org/packages/ishworkh/navigable-date.

Với điều đó thực sự dễ dàng để làm những gì bạn yêu cầu ở đây. Đối với ví dụ:

$format = 'Y-m-d H:i:s'; 

$Date = \NavigableDate\NavigableDateFacade::create('2017-02-24'); 
var_dump($Date->format($format)); 

$resetTime = true; 
$resetDays = true; 

$NextMonth = $Date->nextMonth($resetTime, $resetDays); 

var_dump($NextMonth->format($format)); 

$DayUntilFirstOfNextMonth = $NextMonth->getDifference($Date); 

var_dump('Days left:' . $DayUntilFirstOfNextMonth->format('%d')); 

mang đến cho bạn ouput:

string(19) "2017-02-24 00:00:00" 
string(19) "2017-03-01 00:00:00" 
string(11) "Days left:5" 

Lưu ý: Ngoài ra thư viện này cho phép bạn điều hướng thông qua ngày bằng cách day (s), tuần (s), năm (s) về phía trước hoặc phía sau . Để biết thêm thông tin, hãy xem README của nó.

Các vấn đề liên quan