$ วันที่ + 1 ปี?


91

ฉันกำลังพยายามหาวันที่ที่มีอายุหนึ่งปีนับจากวันที่ฉันระบุ

รหัสของฉันมีลักษณะดังนี้:

$futureDate=date('Y-m-d', strtotime('+one year', $startDate));

มันกลับวันที่ผิด ความคิดใด ๆ ทำไม?


9
คุณลืมบอกเกี่ยวกับข้อผิดพลาด
BalusC

Frank Farmer: คุณแน่ใจเหรอ? ฉันอยากจะรอการแก้ไข / ความคิดเห็นของ OP
BalusC

ด้วยความเร่งรีบในการโพสต์เมื่อคืนนี้ฉันลืมชี้แจง - เป็นการส่งคืนวันที่ผิด ขออภัย! ขอบคุณสำหรับความช่วยเหลือของคุณ.
Matt

1
ใช้แบบนี้แทน strtotime ('+ 1 year', $ startDate));
casivaagustin

คำตอบ:


98

ในการเพิ่มหนึ่งปีในวันนี้ให้ใช้สิ่งต่อไปนี้:

$oneYearOn = date('Y-m-d',strtotime(date("Y-m-d", mktime()) . " + 365 day"));

สำหรับตัวอย่างอื่น ๆ คุณต้องเริ่มต้น $ เริ่มต้นด้วยค่าการประทับเวลาเช่น:

$StartingDate = mktime();  // todays date as a timestamp

ลองทำตามนี้

$newEndingDate = date("Y-m-d", strtotime(date("Y-m-d", strtotime($StaringDate)) . " + 365 day"));

หรือ

$newEndingDate = date("Y-m-d", strtotime(date("Y-m-d", strtotime($StaringDate)) . " + 1 year"));

การเพิ่ม "+365" แทน "+1 ปี" ทำได้แล้ว ขอบคุณ!
Matt

17
จะไม่หยุดพักในปีอธิกสุรทินหรือ?
Jeremy1026

1
ใน PHP 5.1 เมื่อถูกเรียกโดยไม่มีอาร์กิวเมนต์ mktime () จะแสดงการแจ้งเตือน E_STRICT: ใช้ฟังก์ชัน time () แทน
svandragt

โหวตลงที่นี่ด้วย จำนวนวินาทีในหนึ่งวันวันในหนึ่งปีวินาทีในหนึ่งปี ฯลฯ ล้วนเป็นตัวแปร หากคุณสนใจ 'หนึ่งปีจากนี้' คุณต้องผ่านในช่วง 'หนึ่งปี' การแบ่งย่อยด้วยตัวคุณเองคือสิ่งที่นำไปสู่ข้อผิดพลาดในช่วงวันอธิกสุรทินวินาทีอธิกสุรทินและการเปลี่ยนแปลงเวลาออมแสง ที่แย่กว่านั้นคือทำให้เกิดการทดสอบหน่วยเครื่องปัด
drobert

ทำไมคำตอบของฉันจึงถูกโหวตลง ?? $ addedoneyear = วันที่ ("y") + 1; // สำหรับการเพิ่มหนึ่งปีมันผิดอะไร?
pathe.kiran

215
$futureDate=date('Y-m-d', strtotime('+1 year'));

$ futureDate คือหนึ่งปีนับจากนี้!

$futureDate=date('Y-m-d', strtotime('+1 year', strtotime($startDate)) );

$ futureDate คือหนึ่งปีจาก $ startDate!


โปรดทราบว่าหาก $ startDate มีการประทับเวลาอยู่แล้ว (เช่นที่สร้างขึ้นก่อนหน้านี้ด้วยฟังก์ชัน time () หรือ mktime () และไม่ใช่สตริงคุณไม่ควรรวมไว้ใน strtotime มิฉะนั้นจะไม่ทำงาน ให้ทำ$futureDate=date('Y-m-d',strtotime('+1 year',$startDate));ตามที่ K Prime กล่าวไว้ด้านล่างแทน
dallin

9

ลอง: $futureDate=date('Y-m-d',strtotime('+1 year',$startDate));


แม้ว่าจะส่งคืนคำตอบที่ถูกต้อง แต่คำตอบอื่นก็ไม่ได้แสดงข้อผิดพลาดเช่นกัน ... เพียงแค่วันที่ผิด
SeanJA

1
strtotime ไม่ทำให้เกิดข้อผิดพลาด จะส่งคืนเท็จในกรณีที่เกิดข้อผิดพลาด
Frank Farmer

PHP จะเตือนหากไม่ได้ตั้งเขตเวลาเริ่มต้น ... แม้ว่าจะเห็นได้ชัดว่านั่นไม่ใช่สิ่งที่เขาหมายถึง
ก็ตาม

ผมได้รับข้อผิดพลาดในรหัสของคุณผมเปลี่ยน,ไป.และการทำงานdate("Y-m-d",strtotime('+1 year '.$startDate));
Muhammad Bilal

7
// Declare a variable for this year 
$this_year = date("Y");
// Add 1 to the variable
$next_year = $this_year + 1;
$year_after = $this_year + 2;

// Check your code
    echo "This year is ";
    echo $this_year;
    echo "<br />";
    echo "Next year is ";
    echo $next_year;
    echo "<br />";
    echo "The year after that is ";
    echo $year_after;

6

เพิ่งมีปัญหาเดียวกันอย่างไรก็ตามนี่เป็นวิธีแก้ปัญหาที่ง่ายที่สุด:

<?php (date('Y')+1).date('-m-d'); ?>

เยี่ยมมากฉันใช้มันเพื่อรับปีหน้า: $next_year = (date('Y')+1).
Martin

5
//1 year from today's date
echo date('d-m-Y', strtotime('+1 year'));

//1 year from from specific date
echo date('22-09-Y', strtotime('+1 year'));

หวังว่าโค้ดที่ง่ายกว่านี้จะช่วยใครบางคนในอนาคต :)


4

ฉันชอบแนวทาง OO:

$date = new \DateTimeImmutable('today'); //'today' gives midnight, leave blank for current time.
$futureDate = $date->add(\DateInterval::createFromDateString('+1 Year'))

ใช้DateTimeImmutableมิฉะนั้นคุณจะแก้ไขวันที่เดิมด้วย! เพิ่มเติมเกี่ยวกับ DateTimeImmutable: http://php.net/manual/en/class.datetimeimmutable.php


หากคุณต้องการจากวันนี้คุณสามารถทำได้ตลอดเวลา:

new \DateTimeImmutable('-1 Month');

3

หากคุณใช้ PHP 5.3 นั่นเป็นเพราะคุณต้องตั้งค่าเขตเวลาเริ่มต้น:

date_default_timezone_set()

3

strtotime()กำลังส่งคืนbool(false)เนื่องจากไม่สามารถแยกวิเคราะห์สตริงได้'+one year'(ไม่เข้าใจ "one") falseจากนั้นก็ถูกทิ้งโดยปริยายไปประทับเวลาinteger 0เป็นความคิดที่ดีที่จะตรวจสอบstrtotime()ว่าเอาต์พุตไม่ได้อยู่bool(false)ก่อนที่คุณจะนำไปใช้ในฟังก์ชันอื่น ๆ

จากเอกสาร:

ส่งคืนค่า

ส่งคืนการประทับเวลาของความสำเร็จไม่เช่นนั้นจะเป็นเท็จ ก่อนหน้า PHP 5.1.0 ฟังก์ชันนี้จะคืนค่า -1 เมื่อล้มเหลว


ใช่จุดที่ดี รหัสการผลิตของฉันจะมีอย่างนั้น แต่ฉันกำลังฉีกผมออกเพื่อพยายามทำให้สิ่งนี้ใช้งานได้ดังนั้นจึงถอดมันออกให้เหลือรหัสน้อยที่สุด ขอบคุณ!
Matt


1

นอกจากนี้ยังมีวิธีแก้ปัญหาที่ง่ายและซับซ้อนน้อยกว่า:

$monthDay = date('m/d');
$year = date('Y')+1;
$oneYearFuture = "".$monthDay."/".$year."";
echo"The date one year in the future is: ".$oneYearFuture."";

1

ทางออกของฉันคือ: date('Y-m-d', time()-60*60*24*365);

คุณสามารถทำให้ "อ่านได้" มากขึ้นด้วยคำจำกัดความ:

define('ONE_SECOND', 1);
define('ONE_MINUTE', 60 * ONE_SECOND);
define('ONE_HOUR',   60 * ONE_MINUTE);
define('ONE_DAY',    24 * ONE_HOUR);
define('ONE_YEAR',  365 * ONE_DAY);

date('Y-m-d', time()-ONE_YEAR);

-1

ในกรณีของฉัน (ฉันต้องการเพิ่ม 3 ปีในวันที่ปัจจุบัน) วิธีแก้ปัญหาคือ:

$future_date = date('Y-m-d', strtotime("now + 3 years"));

ถึง Gardenee, Treby และ Daniel Lima: วันที่ 29 กุมภาพันธ์จะเกิดอะไรขึ้น? บางครั้งเดือนกุมภาพันธ์มีเพียง 28 วัน :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.