วันที่เพิ่มขึ้นหนึ่งเดือน


105

สมมติว่าฉันมีวันที่ในรูปแบบต่อไปนี้: 2010-12-11 (ปี - จันทร์ - วัน)

ด้วย PHP ฉันต้องการเพิ่มวันที่ทีละหนึ่งเดือนและฉันต้องการให้ปีเพิ่มขึ้นโดยอัตโนมัติหากจำเป็น (เช่นเพิ่มจากธันวาคม 2012 ถึงมกราคม 2013)

ความนับถือ.

คำตอบ:


168
$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 จะแสดงเดือนกรกฎาคมแทนที่จะเป็นเดือนถัดไปซึ่งเป็นเดือนมิถุนายน
Patrick Desjardins

1
ฉันกำลังติดตาม 2014-03-03 สำหรับ 2014-01-31 เหตุผล?
Manish Goyal

ใช้ไม่ได้กับสตริงนี้: "2014-06-19 15:00:19"
Meetai.com

1
บางครั้งอาจแตก คำตอบของ @jason นั้นถูกต้องกว่าในทางเทคนิคเนื่องจากมีการอธิบายถึงสิ่งต่างๆเช่นปีอธิกสุรทินความยาวของเดือนและอื่น ๆ ควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง
skift

4
คำตอบนี้เป็นอันตรายเนื่องจากล้มเหลวในสถานการณ์ "วันสุดท้ายของเดือน" ซึ่งยากที่จะตรวจพบ
ckonig

43

ฉันต้องการฟังก์ชันที่คล้ายกันยกเว้นรอบเดือน (บวกเดือนลบ 1 วัน) หลังจากค้นหา SO สักพักฉันก็สามารถสร้างโซลูชัน 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;
    }

ตัวอย่าง:

$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
ยอดเยี่ยมสิ่งที่ฉันต้องการ ขอบคุณที่ช่วยฉันได้มาก!
ตั้ม

โอเคดีใจที่พบว่ามีประโยชน์
Jason

ขอบคุณ Jason สิ่งนี้มีประโยชน์มาก ฉันจัดรูปแบบใหม่และเพิ่มความคิดเห็นเพิ่มเติมเพื่อช่วยให้ฉันเข้าใจทั้งหมด เผื่อว่าจะช่วยใครได้ฉันได้โพสต์ต่อไป (พยายามเพิ่มที่นี่ แต่มันยาวเกินไป)
Greg

1
ให้คุ้ม 30 ม.ค. และ 31 ม.ค. เหมือนกัน!
Satys

ใช้งานได้เหมือนมีเสน่ห์เพิ่งทดสอบในปี 2020 1 ม.ค. ถึง 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 แก้ไขวัตถุดั้งเดิมซึ่งอาจไม่ต้องการ


2
ไม่ทำงาน .. (DateTime ใหม่ ("2010-01-31" ใหม่ DateTimeZone ("UTC"))) -> เพิ่ม (DateInterval ใหม่ ("P1M")) -> รูปแบบ ('Ym-d') ส่งผลให้ 2010-03-03
Scholtz

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

สิ่งนี้ส่งคืนการประทับเวลาที่สามารถใช้กับฟังก์ชันวันที่


@Gelen: ใช้ไม่ได้ให้วันที่ผิด .... ช่วยบอกวิธีใช้ของคุณค่า $ time ที่นี่คืออะไร?
sqlchild

ไม่ได้ผลให้วันที่ผิด .... โปรดบอกวิธีใช้วิธีการของคุณค่า $ time ที่นี่คืออะไร?
sqlchild

ปัญหาเดียวกับคำตอบที่ยอมรับ ใช้ไม่ได้กับทุกสตริง
Meetai.com

สิ่งนี้ใช้ได้กับฉัน (แน่นอนว่า$timeมีค่าเริ่มต้น)
tatskie

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

ซึ่งจะชดเชยเดือนกุมภาพันธ์และอีก 31 วัน แน่นอนคุณสามารถตรวจสอบได้มากขึ้นเพื่อให้ได้รูปแบบวันที่สัมพัทธ์ของ 'วันนี้ของเดือนหน้า' ที่แน่นอนมากขึ้น(ซึ่งไม่ได้ผลน่าเศร้าดูด้านล่าง) และคุณสามารถใช้ DateTime ได้เช่นกัน

ทั้งคู่DateInterval('P1M')และstrtotime("+1 month")จะเพิ่ม 31 วันแบบสุ่มสี่สุ่มห้าโดยไม่คำนึงถึงจำนวนวันในเดือนถัดไป

  • 2010-01-31 => 3 มีนาคม
  • 2012-01-31 => 2 มีนาคม (ปีอธิกสุรทิน)

3
"เพิ่ม 31 วันสุ่มสี่สุ่มห้าโดยไม่คำนึงถึงจำนวนวันในเดือนถัดไป" ใช่เลย! (+1)
Jose Manuel Abarca Rodríguez

6

คุณสามารถใช้DateTime::modifyสิ่งนี้:

$date = new DateTime('2010-12-11');
$date->modify('+1 month');

ดูเอกสาร:

http://php.net/manual/fr/datetime.modify.php

http://php.net/manual/fr/class.datetime.php


1
นี้กระโดดจากวันที่ 31 พฤษภาคมถึง 1 กรกฎาคมซึ่งไม่ถูกต้อง
ckonig

ใช่แน่นอน ... ฉันจะแก้ไขโพสต์เพื่อแก้ปัญหานี้
HRoux

ยังคงแตก:php > var_dump((new DateTime('2010-05-31'))->modify('+1 month')); object(DateTime)#2 (3) { ["date"]=> string(26) "2010-07-01 00:00:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" }
Chris Stryczynski

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
ได้ผลสำหรับฉันขอบคุณ แต่วันที่ ('m', strtotime ("+ 1 เดือน", strtotime ($ occDate))) และวันที่ ('m', strtotime ("+ 1 month", $ occDate)) จะทำงานเหมือนกัน

1
ไม่ทั้งสองคือความแตกต่าง @ sah.cyBuzzSc ลองพิจารณาตัวอย่าง: - $ occDate = '2014-12-28'; $ forOdNextMonth = วันที่ ('m', strtotime ("+ 1 เดือน", $ occDate)); มูลค่า $ forOdNextMonth คือ 02
vineet

ขอบคุณที่อธิบาย @chotesah ตัวอย่างที่สองของคุณค่อนข้างดี

5

ก่อนอื่นคุณต้องตั้งค่ารูปแบบวันที่ของคุณเป็นวันที่ 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 คือ 12-12-2013


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

เพียงแค่เปลี่ยนรูปแบบวันที่


0

หากคุณต้องการได้รับวันที่หนึ่งเดือนนับจากนี้คุณสามารถทำได้เช่นนี้

echo date('Y-m-d', strtotime('1 month'));

หากคุณต้องการรับวันที่สองเดือนนับจากนี้คุณสามารถทำได้โดยทำสิ่งนี้

echo date('Y-m-d', strtotime('2 month'));

นั่นคือทั้งหมดที่


-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 :: modifiedให้ผลลัพธ์ที่ไม่ถูกต้องในบางครั้ง
ตัวอย่าง:
- 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.