2010-05-20 13 views
67

Powiedzmy mam datę w następującym formacie: 2010-12-11 (rok-mon-dniowe)data przyrost o jeden miesiąc

PHP, chcę, aby zwiększyć datę o jeden miesiąc, a ja aby rok był automatycznie zwiększany, w razie potrzeby (tj. zwiększanie od grudnia 2012 r. do stycznia 2013 r.).

Pozdrawiam.

Odpowiedz

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

To nie działa z całą datą. Na przykład 2013-05-31 wyświetli się lipiec zamiast następnego miesiąca, czyli czerwca. –

+1

Dostaję następujące, 2014-03-03 na 2014-01-31 powodu? –

+0

To nie działało z tym ciągiem: "2014-06-19 15:00:19" –

20

Użyj DateTime::add.

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

Użyłem clone ponieważ add modyfikuje oryginalny obiekt, co może nie być pożądane.

+0

To działa, ale chciałbym dodać metodę zwrotu. –

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

to zwraca znacznik czasu, który może być używany z funkcją date

+0

@Gelen: to nie działa, podaje niewłaściwą datę .... proszę, powiedz, jak użyć swojej metody, jaka jest wartość $ czasu tutaj? – sqlchild

+0

to nie działa, podaje niewłaściwą datę .... proszę powiedzieć, jak użyć swojej metody, jaka jest wartość czasu $ tutaj? – sqlchild

+0

Ten sam problem, co zaakceptowana odpowiedź. Nie działa na wszystkich ciągach. –

27

potrzebowałem podobną funkcjonalność, z wyjątkiem cyklu miesięcznym (plus miesięcy minus 1 dzień). Po przeszukaniu S.O. przez pewien czas, to w stanie jednostek tego rozwiązania wtyk-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; 
    } 

Przykład:

$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

Doskonały, dokładnie to, czego potrzebowałem. Dziękuję, że oszczędziłeś mi dużo czasu! – Tumtum

+0

Nie ma problemu, cieszę się, że uznałeś to za przydatne – Jason

+0

Dzięki Jason, to było bardzo pomocne. Przeformatowałem go i dodałem więcej komentarzy, aby pomóc mi zrozumieć wszystko. W przypadku, który pomaga każdemu, umieściłem go dalej (próbowałem dodać tutaj, ale to było za długie). – ScreenWatcher

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

ten kompensuje lutego i innych 31-dniowa miesięcy. Można oczywiście zrobić o wiele więcej sprawdzeń, aby uzyskać dokładniejsze informacje na temat "tego dnia następnego miesiąca" relative date formats (co nie działa niestety, patrz poniżej), a równie dobrze można wykorzystać DateTime.

Zarówno DateInterval('P1M'), jak i strtotime("+1 month") zasadniczo ślepo dodają 31 dni niezależnie od liczby dni w kolejnym miesiącu.

  • 2010-01-31 => 03 marca
  • 2012-01-31 => 02 marca (rok przestępny)
+0

"ślepo dodając 31 dni bez względu na liczbę dni w następnym miesiącu", absolutnie dobrze! (+1). –

4

używam w ten sposób: -

$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

to działa dla mnie dzięki. Ale data ("m", strtotime ("+ 1 miesiąc", strtotime ($ occDate))) i data ("m", strtotime ("+ 1 miesiąc", $ occDate)) działają tak samo. –

+1

Nie, obie to różnica @ sah.cyBuzzSc. Rozważ przykład: - $ occDate = '2014-12-28'; $ forOdNextMonth = date ('m', strtotime ("+ 1 miesiąc", $ occDate)); Wartość $ forOdNextMonth to 02. – vineet

+0

dzięki za wyjaśnienie @chotesah. Twój drugi przykład jest całkiem dobry. –

0

Dzięki Jason, twój post był bardzo pomocny. Przeformatowałem go i dodałem więcej komentarzy, aby pomóc mi zrozumieć wszystko.W przypadku, który pomaga nikomu, ja napisałem go tutaj:

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

Proszę najpierw ustawić format daty jako podobny 12-12-2012

Po użyciu tej funkcji pracują prawidłowo;

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

Tutaj 12-12-2012 to Twoja data, a +2 Miesiące to przyrost miesiąca;

też przyrost Roku Data

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

Ans jest 12-12-2013

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

przykłady wykorzystania:

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

Jeśli chcesz zwiększyć w ciągu dni możesz to zrobić również

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

Dla każdego, kto szuka odpowiedzi na dowolny format daty.

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

Wystarczy zmienić format daty.

-1

umieścić datę w polu tekstowym, a następnie kliknij przycisk dostać dzień od daty w 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

to nie działa – user9401222