날짜를 1 개월 씩 증가


103

다음 형식의 날짜가 있다고 가정 해 보겠습니다. 2010-12-11 (연-월-일)

PHP를 사용하여 날짜를 한 달씩 늘리고, 필요한 경우 연도를 자동으로 늘리기를 원합니다 (예 : 2012 년 12 월부터 2013 년 1 월까지 증가).

문안 인사.

답변:


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

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

31
모든 날짜에서 작동하지 않습니다. 예를 들어 2013-05-31은 다음 달인 6 월 대신 7 월을 표시합니다.
Patrick Desjardins 2013 년

1
2014-01-31 이유로 2014-03-03을 팔로우하고 있습니까?
Manish Goyal

다음 문자열에서는 작동하지 않았습니다. "2014-06-19 15:00:19"
Meetai.com

1
이것은 때때로 깨집니다. @jason의 대답은 윤년, 월 길이 등을 설명하기 때문에 기술적으로 더 정확합니다. 정답으로 표시되어야합니다.
skift

4
이 답변은 감지하기 어려운 "매월 마지막 날"시나리오에서 실패하기 때문에 위험합니다.
ckonig

43

월간주기 (더하기 개월, 빼기 1 일)를 제외하고는 유사한 기능이 필요했습니다. 잠시 동안 검색 한 후이 플러그 앤 플레이 솔루션을 만들 수있었습니다.

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

예:

$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

3
훌륭합니다. 제가 필요한 것입니다. 시간을 많이 절약 해주셔서 감사합니다!
Tum

문제 없습니다, 다행 당신은 그것을 유용하게 찾을 수 없습니다
제이슨

감사합니다 Jason, 이것은 매우 도움이되었습니다. 나는 그것을 모두 이해할 수 있도록 그것을 다시 포맷하고 더 많은 주석을 추가했습니다. 누구에게나 도움이 될 수 있도록 더 아래에 게시했습니다 (여기에 추가하려고했지만 너무 깁니다).
Greg

1
하지만 1 월 30 일과 1 월 31 일에 동일한 값을 제공합니다!
Satys

매력처럼 작동하며 2020 년 1 월 1 일부터 12 월 31 일까지 테스트했습니다. 감사합니다!
Paul Nowak

34

사용 DateTime::add.

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

add는 원치 않는 원본 객체를 수정하기 때문에 복제를 사용했습니다 .


1
작동하지 않습니다. (new DateTime ( "2010-01-31", new DateTimeZone ( "UTC")))-> add (new DateInterval ( "P1M"))-> format ( 'Ym-d') 결과 2010-03-03
Scholtz

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

이것은 날짜 함수와 함께 사용할 수있는 타임 스탬프를 반환합니다.


@Gelen : 작동하지 않고 잘못된 날짜를 제공합니다 .... 방법을 사용하는 방법을 알려주세요. $ time의 가치는 무엇입니까?
sqlchild

이것은 작동하지 않습니다, 잘못된 날짜를 제공합니다 .... 방법을 사용하는 방법을 알려주십시오. 여기서 $ time의 가치는 무엇입니까?
sqlchild

수락 된 답변과 동일한 문제입니다. 모든 문자열에서 작동하지 않습니다.
Meetai.com 2014-06-22

이것은 나를 위해 작동합니다 (물론 $time초기 값이 있습니다).
tatskie

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

이것은 2 월과 다른 31 일의 달을 보상합니다. 물론 '다음 달 오늘' 상대 날짜 형식 (슬프게도 작동하지 않음, 아래 참조)을 더 정확하게 확인하기 위해 더 많은 검사를 수행 할 수 있으며 DateTime을 사용할 수도 있습니다.

모두 DateInterval('P1M')strtotime("+1 month")본질적으로 맹목적으로 다음 달에 관계없이 일수 31 일 추가됩니다.

  • 2010-01-31 => 3 월 3 일
  • 2012-01-31 => 3 월 2 일 (윤년)

3
"다음 달의 일수에 관계없이 맹목적으로 31 일을 더한다", 절대적으로 맞다! (+1).
Jose Manuel Abarca Rodríguez


5

이 방법으로 사용합니다.

 $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
그것은 나를 위해 작동합니다. 그러나 date ( 'm', strtotime ( "+ 1 month", strtotime ($ occDate))) 및 date ( 'm', strtotime ( "+ 1 month", $ occDate))는 동일하게 작동합니다.

1
아니요, 둘 다 @ sah.cyBuzzSc 차이입니다. 예를 들어 보자 :-$ occDate = '2014-12-28'; $ forOdNextMonth = date ( 'm', strtotime ( "+ 1 개월", $ occDate)); 값 $ forOdNextMonth은 02입니다
vineet

@chotesah를 설명해 주셔서 감사합니다. 두 번째 예는 아주 좋습니다.

3

먼저 날짜 형식을 12-12-2012와 같이 설정하십시오.

이 기능을 사용하면 제대로 작동합니다.

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

여기서 12-12-2012는 귀하의 날짜이고 +2 개월은 해당 월의 증분입니다.

연도, 날짜도 증가합니다.

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

Ans는 2013 년 12 월 12 일입니다.


1

감사합니다 Jason, 귀하의 게시물이 매우 유용했습니다. 나는 그것을 모두 이해할 수 있도록 그것을 다시 포맷하고 더 많은 주석을 추가했습니다. 누구에게나 도움이 될 수 있도록 여기에 게시했습니다.

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

1
$date = strtotime("2017-12-11");
$newDate = date("Y-m-d", strtotime("+1 month", $date));

일 단위로 늘리려면 할 수도 있습니다.

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

1

몇 개월 후 날짜를 찾는 간단한 방법으로 답변을 업데이트하십시오. 표시된 베스트 답변은 올바른 솔루션을 제공하지 않습니다.

<?php

    $date = date('2020-05-31');
    $current = date("m",strtotime($date));
    $next = date("m",strtotime($date."+1 month"));
    if($current==$next-1){
        $needed = date('Y-m-d',strtotime($date." +1 month"));
    }else{
        $needed = date('Y-m-d', strtotime("last day of next month",strtotime($date)));
    }
    echo "Date after 1 month from 2020-05-31 would be : $needed";

?>

이것은 +1 개월 날짜에 대한 올바른 솔루션입니다.
asad 앱

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

사용 예 :

echo dayOfWeek(2016-12-22);
// "4"
echo dayOfWeek(date('Y-m-d'));
// "4"

0

모든 날짜 형식에 대한 답변을 찾고있는 사람을 위해.

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

날짜 형식 만 변경하면됩니다.


-2

입력 상자에 날짜를 입력 한 다음 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()]);

    });  
             });

-2
 <?php
              $selectdata ="select fromd,tod  from register where username='$username'";
            $q=mysqli_query($conm,$selectdata);
            $row=mysqli_fetch_array($q);

            $startdate=$row['fromd']; 
            $stdate=date('Y', strtotime($startdate));  

            $endate=$row['tod']; 
            $enddate=date('Y', strtotime($endate));  

            $years = range ($stdate,$enddate);
            echo '<select name="years" class="form-control">';
            echo '<option>SELECT</option>';
            foreach($years as $year)
              {   echo '<option value="'.$year.'"> '.$year.' </option>';  }
                echo '</select>'; ?>

2
붙여 넣기 코드를 복사하는 것이 항상 도움이되는 것은 아닙니다. 코드에 대해서도 약간 설명해야합니다.
mrkernelpanic

-2

제시된 모든 솔루션 이 제대로 작동하지 않습니다.
strtotime () 및 DateTime :: add 또는 DateTime :: modify 는 때때로 잘못된 결과를 제공합니다.
예 :
-31.08.2019 + 1 개월은 01.10.2019 대신 30.09.2019-29.02.2020
+ 1 년은 01.03.2021 대신 28.02.2021
(PHP 5.5, PHP 7.3에서 테스트 됨)

다음은 문제를 해결하는 Angelo게시 한 아이디어를 기반으로 한 내 기능입니다 .

// $time - unix time or date in any format accepted by strtotime() e.g. 2020-02-29  
// $days, $months, $years - values to add
// returns new date in format 2021-02-28
function addTime($time, $days, $months, $years)
{
    // Convert unix time to date format
    if (is_numeric($time))
    $time = date('Y-m-d', $time);

    try
    {
        $date_time = new DateTime($time);
    }
    catch (Exception $e)
    {
        echo $e->getMessage();
        exit;
    }

    if ($days)
    $date_time->add(new DateInterval('P'.$days.'D'));

    // Preserve day number
    if ($months or $years)
    $old_day = $date_time->format('d');

    if ($months)
    $date_time->add(new DateInterval('P'.$months.'M'));

    if ($years)
    $date_time->add(new DateInterval('P'.$years.'Y'));

    // Patch for adding months or years    
    if ($months or $years)
    {
        $new_day = $date_time->format("d");

        // The day is changed - set the last day of the previous month
        if ($old_day != $new_day)
        $date_time->sub(new DateInterval('P'.$new_day.'D'));
    }
    // You can chage returned format here
    return $date_time->format('Y-m-d');
}

사용 예 :

echo addTime('2020-02-29', 0, 0, 1); // add 1 year (result: 2021-02-28)
echo addTime('2019-08-31', 0, 1, 0); // add 1 month (result: 2019-09-30)
echo addTime('2019-03-15', 12, 2, 1); // add 12 days, 2 months, 1 year (result: 2019-09-30)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.