2010-05-20 42 views
67

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

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 thiết (tức là tăng từ tháng 12 năm 2012 đến tháng 1 năm 2013).

Trân trọng.

Trả lời

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

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

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. –

+1

Tôi nhận được sau đây, 2014-03-03 cho 2014-01-31 lý do? –

+0

Nó không hoạt động với chuỗi này: "2014-06-19 15:00:19" –

20

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 clone vì thêm sửa đổi đối tượng gốc, có thể không mong muốn.

+0

Tác phẩm này, nhưng tôi sẽ thêm phương thức trả lại. –

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

này trả về một dấu thời gian mà có thể được sử dụng với chức năng ngày

+0

@Gelen: tính năng này không hoạt động, đưa ra ngày sai .... vui lòng cho biết cách sử dụng phương pháp của bạn, giá trị của $ time ở đây là bao nhiêu? – sqlchild

+0

đ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

+0

Cùng một vấn đề với câu trả lời được chấp nhận. Không hoạt động trên tất cả các chuỗi. –

27

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

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

Ví 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 
+1

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! – Tumtum

+0

Không có vấn đề, vui vì bạn thấy nó hữu ích – Jason

+0

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

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

này sẽ bù đắp cho tháng Hai và tháng 31 ngày khác. Tất nhiên bạn có thể kiểm tra để có được chính xác hơn cho 'ngày này vào tháng tới' relative date formats (không hoạt động đáng buồn, xem bên dưới), và bạn cũng có thể sử dụng DateTime.

Cả hai DateInterval('P1M')strtotime("+1 month") về cơ bản là 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 03 tháng 3
  • 2012-01-31 => 02 tháng 3 (năm nhuận)
+0

"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). –

4

tôi sử dụng theo 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; 
//******************************************************************// 
+1

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ự. –

+1

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

+0

cảm ơn vì đã giải thích @chotesah. Ví dụ thứ hai của bạn khá tốt. –

0

Cảm ơn Jason, bài đăng của bạn 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ó ở đây:

function cycle_end_date($cycle_start_date, $months) { 
    $cycle_start_date_object = new DateTime($cycle_start_date); 

    //Find the date interval that we will need to add to the start date 
    $date_interval = find_date_interval($months, $cycle_start_date_object); 

    //Add this date interval to the current date (the DateTime class handles remaining complexity like year-ends) 
    $cycle_end_date_object = $cycle_start_date_object->add($date_interval); 

    //Subtract (sub) 1 day from date 
    $cycle_end_date_object->sub(new DateInterval('P1D')); 

    //Format final date to Y-m-d 
    $cycle_end_date = $cycle_end_date_object->format('Y-m-d'); 

    return $cycle_end_date; 
} 

//Find the date interval we need to add to start date to get end date 
function find_date_interval($n_months, DateTime $cycle_start_date_object) { 
    //Create new datetime object identical to inputted one 
    $date_of_last_day_next_month = new DateTime($cycle_start_date_object->format('Y-m-d')); 

    //And modify it so it is the date of the last day of the next month 
    $date_of_last_day_next_month->modify('last day of +'.$n_months.' month'); 

    //If the day of inputted date (e.g. 31) is greater than last day of next month (e.g. 28) 
    if($cycle_start_date_object->format('d') > $date_of_last_day_next_month->format('d')) { 
     //Return a DateInterval object equal to the number of days difference 
     return $cycle_start_date_object->diff($date_of_last_day_next_month); 
    //Otherwise the date is easy and we can just add a month to it 
    } else { 
     //Return a DateInterval object equal to a period (P) of 1 month (M) 
     return new DateInterval('P'.$n_months.'M'); 
    } 
} 

$cycle_start_date = '2014-01-31'; // select date in Y-m-d format 
$n_months = 1; // choose how many months you want to move ahead 
$cycle_end_date = cycle_end_date($cycle_start_date, $n_months); // output: 2014-07-02 
2

Hãy đầu tiên bạn thiết lập định dạng ngày của bạn như như 12-12-2012

Sau khi sử dụng chức năng này nó làm việc đúng cách;

$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 có thặng dư của Năm, ngày

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

Ans là 12-12-2013

0
function dayOfWeek($date){ 
    return DateTime::createFromFormat('Y-m-d', $date)->format('N'); 
} 

ví dụ sử dụng:

echo dayOfWeek(2016-12-22); 
// "4" 
echo dayOfWeek(date('Y-m-d')); 
// "4" 
0
$date = strtotime("2017-12-11"); 
$newDate = date("Y-m-d", strtotime("+1 month", $date)); 

Nếu bạn muốn tăng theo ngày bạn cũng có thể làm điều đó

$date = strtotime("2017-12-11"); 
$newDate = date("Y-m-d", strtotime("+5 day", $date)); 
0

Đối với bất kỳ ai đang tìm kiếm câu trả lời cho bất kỳ định dạng ngày nào.

echo date_create_from_format('d/m/Y', '15/04/2017')->add(new DateInterval('P1M'))->format('d/m/Y'); 

Chỉ cần thay đổi định dạng ngày.

-1

đặt một ngày trong hộp đầu vào sau đó nhấn nút lấy ngày kể từ ngày trong jquery

$(document).ready(function() { 
    $("button").click(function(){ 
    var day = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]; 
    var a = new Date(); 
    $(".result").text(day[a.getDay()]); 

    }); 
      }); 
+0

nó không hoạt động – user9401222

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