Câu hỏi ngày tăng thêm một tháng


Giả sử tôi có một ngày theo định dạng sau: 2010-12-11 (năm-mon-ngày)

Với PHP, tôi muốn tăng ngày thêm một tháng và tôi muốn năm được tự động tăng lên, nếu cần (tức là tăng từ tháng 12 năm 2012 đến tháng 1 năm 2013).

Trân trọng.


76
2018-05-20 00:15


gốc




Các câu trả lời:


$time = strtotime("2010.12.11");
$final = date("Y-m-d", strtotime("+1 month", $time));

// Finally you will have the date you're looking for.

119
2018-05-20 00:45



Nó không hoạt động với tất cả các ngày. Ví dụ: 2013-05-31 sẽ hiển thị tháng 7 thay vì tháng tiếp theo vào tháng 6. - Patrick Desjardins
Tôi đang nhận được sau đây, 2014-03-03 cho 2014-01-31 lý do? - Manish Goyal
Nó không hoạt động với chuỗi này: "2014-06-19 15:00:19" - Meetai.com
php.net/manual/en/function.strtotime.php Y-M-D là strtotime ("2010.12.11"); * (dấu chấm, không phải dấu gạch ngang) - Joeri
Điều này đôi khi bị phá vỡ. Câu trả lời của @jason về mặt kỹ thuật là chính xác hơn vì nó chiếm những thứ như năm nhuận, độ dài tháng, v.v. Điều đó sẽ được đánh dấu là câu trả lời đúng. - skift


Tôi cần chức năng tương tự, ngoại trừ chu kỳ hàng tháng (cộng tháng, trừ 1 ngày). Sau khi tìm kiếm S.O. trong một thời gian, tôi đã có thể tạo ra giải pháp plug-n-play này:

function add_months($months, DateTime $dateObject) 
    {
        $next = new DateTime($dateObject->format('Y-m-d'));
        $next->modify('last day of +'.$months.' month');

        if($dateObject->format('d') > $next->format('d')) {
            return $dateObject->diff($next);
        } else {
            return new DateInterval('P'.$months.'M');
        }
    }

function endCycle($d1, $months)
    {
        $date = new DateTime($d1);

        // call second function to add the months
        $newDate = $date->add(add_months($months, $date));

        // goes back 1 day from date, remove if you want same day of month
        $newDate->sub(new DateInterval('P1D')); 

        //formats final date to Y-m-d form
        $dateReturned = $newDate->format('Y-m-d'); 

        return $dateReturned;
    }

Thí dụ:

$startDate = '2014-06-03'; // select date in Y-m-d format
$nMonths = 1; // choose how many months you want to move ahead
$final = endCycle($startDate, $nMonths); // output: 2014-07-02

28
2018-06-03 11:55



Tuyệt vời, chỉ là những gì tôi cần. Cảm ơn đã cứu tôi rất nhiều thời gian! - Tum
Không sao cả, rất vui vì bạn thấy nó hữu ích - Jason
Cảm ơn Jason, điều này rất hữu ích. Tôi đã định dạng lại nó và thêm nhiều nhận xét để giúp tôi hiểu tất cả. Trong trường hợp đó giúp bất cứ ai, tôi đã đăng nó xuống hơn (cố gắng để thêm nó ở đây nhưng nó đã quá dài). - ScreenWatcher


Sử dụng DateTime::add.

$start = new DateTime("2010-12-11", new DateTimeZone("UTC"));
$month_later = clone $start;
$month_later->add(new DateInterval("P1M"));

Tôi đã sử dụng bản sao bởi vì thêm sửa đổi đối tượng gốc, có thể không được mong muốn.


23
2018-05-20 00:17



Điều này làm việc, nhưng tôi muốn thêm phương thức trả về. - Meetai.com


strtotime( "+1 month", strtotime( $time ) );

điều này trả về dấu thời gian có thể được sử dụng với hàm ngày tháng


11
2018-05-20 00:18



@ Gelen: điều này không hoạt động, cung cấp cho ngày sai .... xin vui lòng cho biết làm thế nào để sử dụng phương pháp của bạn, giá trị của $ thời gian ở đây là gì? - sqlchild
điều này không hoạt động, đưa ra ngày sai .... hãy nói cách sử dụng phương pháp của bạn, giá trị của $ time ở đây là bao nhiêu? - sqlchild
Cùng một vấn đề như câu trả lời được chấp nhận. Không hoạt động trên tất cả các chuỗi. - Meetai.com
điều này làm việc cho tôi (tất nhiên $time có giá trị ban đầu). - tatskie


Tôi sử dụng cách này: -

 $occDate='2014-01-28';
 $forOdNextMonth= date('m', strtotime("+1 month", strtotime($occDate)));
//Output:- $forOdNextMonth=02


/*****************more example****************/
$occDate='2014-12-28';

$forOdNextMonth= date('m', strtotime("+1 month", strtotime($occDate)));
//Output:- $forOdNextMonth=01

//***********************wrong way**********************************//
$forOdNextMonth= date('m', strtotime("+1 month", $occDate));
  //Output:- $forOdNextMonth=02; //instead of $forOdNextMonth=01;
//******************************************************************//

5
2018-01-19 05:42



nó làm việc cho tôi cảm ơn. Nhưng, ngày ('m', strtotime ("+ 1 tháng", strtotime ($ occDate))) và ngày ('m', strtotime ("+ 1 tháng", $ occDate)) hoạt động tương tự.
Không, cả hai đều khác biệt @ sah.cyBuzzSc. Hãy xem xét ví dụ: - $ occDate = '2014-12-28'; $ forOdNextMonth = date ('m', strtotime ("+ 1 tháng", $ occDate)); Giá trị $ forOdNextMonth là 02. - vineet
cảm ơn vì đã giải thích @chotesah. Ví dụ thứ hai của bạn khá tốt.


(date('d') > 28) ? date("mdY", strtotime("last day of next month")) : date("mdY", strtotime("+1 month"));

Điều này sẽ bù đắp cho tháng 2 và 31 tháng khác. Tất nhiên, bạn có thể kiểm tra nhiều hơn để có được chính xác hơn cho 'ngày này vào tháng tới' định dạng ngày tương đối (mà không làm việc đáng buồn, xem bên dưới), và bạn cũng có thể sử dụng DateTime.

Cả hai DateInterval('P1M') và strtotime("+1 month") về cơ bản một cách mù quáng thêm 31 ngày bất kể số ngày trong tháng tiếp theo.

  • 2010-01-31 => ngày 3 tháng 3
  • 2012-01-31 => ngày 2 tháng 3 (năm nhuận)

4
2017-11-10 22:07



"một cách mù quáng thêm 31 ngày bất kể số ngày trong tháng tiếp theo", hoàn toàn đúng! (+1). - Jose Manuel Abarca Rodríguez


Trước tiên, hãy đặt định dạng ngày tháng của bạn giống như 12-12-2012

Sau khi sử dụng chức năng này nó hoạt động đúng;

$date =  date('d-m-Y',strtotime("12-12-2012 +2 Months");

Ở đây 12-12-2012 là ngày của bạn và +2 tháng tăng dần của tháng;

Bạn cũng tăng của năm, ngày

strtotime("12-12-2012 +1 Year");

Ans là 12-12-2013


3
2017-11-15 09:32