เพิ่มหนึ่งวันในวันที่


172

รหัสของฉันที่จะเพิ่มหนึ่งวันในวันที่จะคืนวันที่ก่อนหน้าวันที่เพิ่ม: 2009-09-30 20:24:00วันที่หลังจากเพิ่มหนึ่งวัน SHOULD จะถูกนำไปวางในเดือนถัดไป:1970-01-01 17:33:29

<?php

    //add day to date test for month roll over

    $stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00"));

    echo 'date before day adding: '.$stop_date; 

    $stop_date = date('Y-m-d H:i:s', strtotime('+1 day', $stop_date));

    echo ' date after adding one day. SHOULD be rolled over to the next month: '.$stop_date;
?>

ฉันเคยใช้รหัสที่คล้ายกันมาก่อนฉันทำอะไรผิดที่นี่

คำตอบ:


333
<?php
$stop_date = '2009-09-30 20:24:00';
echo 'date before day adding: ' . $stop_date; 
$stop_date = date('Y-m-d H:i:s', strtotime($stop_date . ' +1 day'));
echo 'date after adding 1 day: ' . $stop_date;
?>

สำหรับ PHP 5.2.0+ คุณสามารถทำได้ดังนี้:

$stop_date = new DateTime('2009-09-30 20:24:00');
echo 'date before day adding: ' . $stop_date->format('Y-m-d H:i:s'); 
$stop_date->modify('+1 day');
echo 'date after adding 1 day: ' . $stop_date->format('Y-m-d H:i:s');

3
ขอบคุณ แก้ไขมันเป็น: $ stop_date = date ('Ymd H: i: s', strtotime ("$ stop_date + 1 วัน"));
เอียน

11
คุณไม่ควรใช้ตัวแปรในสตริง คุณควรใช้: date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));ในคำตอบที่ @ w35l3y มอบให้คุณ
Cas Bloem

คุณควรเพิ่มการเรียกไปยังฟังก์ชัน date_default_timezone_set ก่อนเรียกใช้รหัสนี้ ตัวอย่างเช่นเพิ่ม date_default_timezone_set ('ยุโรป / โรม');
Luca Mastrostefano

96
$date = new DateTime('2000-12-31');

$date->modify('+1 day');
echo $date->format('Y-m-d') . "\n";

6
นี่เป็นโซลูชันที่สมบูรณ์แบบกว่านี้
Cas Bloem

... ตราบใดที่มันไม่ได้ก่อให้เกิดข้อผิดพลาดร้ายแรงเมื่อทำงานบนโฮสต์ของคุณ;)
เฮนริก Erlandsson

อย่าขอโทษ บางคนโพสต์คำตอบ dame 3 ปีหลังจากที่คุณทำ
Mawg พูดว่าคืนสถานะโมนิก้า

1
คุณควรเพิ่มการเรียกไปยังฟังก์ชัน date_default_timezone_set ก่อนเรียกใช้รหัสนี้ ตัวอย่างเช่นเพิ่ม date_default_timezone_set ('ยุโรป / โรม');
Luca Mastrostefano

@LucaMastrostefano ไม่มีคุณควรจะมีการตั้งค่าเขตเวลาบนเซิร์ฟเวอร์ของคุณ ...
MH

28

วิธีที่ง่ายที่สุด:

$date = new DateTime('+1 day');
echo $date->format('Y-m-d H:i:s');

ฉันชอบวิธีการของคุณในหนึ่งซับecho (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Aba

@Aba ฉันไม่คิดว่าสายการบินหนึ่งของคุณทำงานใน PHP รุ่นเก่ากว่าเพราะฉันลองแล้วเกิดข้อผิดพลาด:Unexpected T_OBJECT_OPERATOR” error in PHP
Zachary Weixelbaum

25

มันได้ผลสำหรับฉัน: สำหรับวันที่ปัจจุบัน

$date = date('Y-m-d', strtotime("+1 day"));

สำหรับวันที่ใด ๆ :

date('Y-m-d', strtotime("+1 day", strtotime($date)));

2
ขอบคุณมันใช้งานได้สำหรับฉัน ง่ายที่สุดของโซลูชันทั้งหมดที่กำหนด
Puneet Verma

2
คุณไม่จำเป็นต้องทำซ้ำและซ้อนstrtotime()มันสามารถจัดการทุกอย่างในการโทรครั้งเดียว:date('Y-m-d', strtotime($date . " +1 day"));
billynoah

2
นีซนี่คือทางออกที่ง่ายที่สุด! ขอบคุณ
แองเจิล


6

ง่ายต่อการอ่านและทำความเข้าใจวิธี:

$original_date = "2009-09-29";

$time_original = strtotime($original_date);
$time_add      = $time_original + (3600*24); //add seconds of one day

$new_date      = date("Y-m-d", $time_add);

echo $new_date;

3
สิ่งนี้จะล้มเหลวในบางครั้งเมื่อมีการเปลี่ยนการออมในเวลากลางวันเมื่อไม่ใช่ 24 ชั่วโมง
Nik Dow

3

ฉันมักจะเพิ่ม 86400 (ไม่กี่วินาทีในหนึ่งวัน):

$stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00") + 86400);

echo 'date after adding 1 day: '.$stop_date; 

มันไม่ใช่วิธีที่ลื่นที่สุดที่คุณสามารถทำได้ แต่ใช้งานได้!


คุณจะจัดการกับเผ่นวินาทีเมื่อเพิ่ม 86400 จะไม่ทำงานเพราะมี 86401 วินาทีในวันนั้น? (ตกลงฉันรู้ว่ามันจะเกิดขึ้นทุกสองสามปีที่ผ่านมา แต่ขึ้นอยู่กับแอปนี้อาจจะมีความสำคัญ)
เกลน

1
ไม่ใช่ทุกวันมี 86400 วินาทีในนั้น ในความเป็นจริงในสถานที่ส่วนใหญ่ในสหรัฐอเมริกามี 3600 วินาทีน้อยกว่าหรือเพิ่มอีกสองครั้งต่อปี
Peter Kovacs

1
คุณสามารถละเว้นเผ่นวินาทีได้อย่างปลอดภัยเนื่องจาก "Unix time" นี้มีความซับซ้อนบ้าง แต่อ่านบทความนี้สำหรับข้อมูลเพิ่มเติม: derickrethans.nl/leap_seconds_and_what_to_do_with_them.php
คริสเตียน Daven

2
คุณควรหลีกเลี่ยงวิธีนี้ นี่คือเหตุผล: stackoverflow.com/questions/2613338/…
mspir

1
อย่าเพิ่มวันที่โดยเพิ่ม 86400 วินาทีในวันก่อนหน้า! คุณจะมีข้อผิดพลาดในรหัสของคุณ! สิ่งนี้ไม่สามารถใช้งานได้ในช่วงกลางวัน
sbrbot

1

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

หากคุณเปิดการรายงานข้อผิดพลาดสูงสุดคุณจะเห็นว่านี่เป็นข้อผิดพลาด "ค่าตัวเลขที่ไม่ดี" ซึ่งเป็นระดับ E_NOTICE


1

modify()วิธีการที่สามารถนำมาใช้เพื่อเพิ่มการเพิ่มขึ้นที่มีอยู่DateTimeค่า

สร้างDateTimeวัตถุใหม่ด้วยวันที่และเวลาปัจจุบัน:

$due_dt = new DateTime();

เมื่อคุณมีDateTimeวัตถุคุณสามารถจัดการค่าของมันโดยการเพิ่มหรือลบช่วงเวลา:

$due_dt->modify('+1 day');

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับคู่มือการใช้งาน PHP


0

รหัสต่อไปนี้จะได้รับวันแรกของเดือนมกราคมของปีปัจจุบัน (แต่อาจเป็นวันที่อื่น) และเพิ่ม 365 วันในวันนั้น (แต่สามารถเป็นจำนวน N วัน) โดยใช้คลาส DateTime และวิธีการแก้ไข () และรูปแบบ ( ):

echo (new DateTime((new DateTime())->modify('first day of January this year')->format('Y-m-d')))->modify('+365 days')->format('Y-m-d');

0

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

บ่อยครั้งที่คุณพบว่าตัวเองกำลังวางปัญหาในแง่ของการแก้ปัญหา นี่เป็นเพียงหนึ่งในเหตุผลที่คุณท้ายด้วยรหัสจำเป็น มันยอดเยี่ยมถ้ามันใช้งานได้; มีเพียงทางเลือกอื่นเนื้อหาที่บำรุงรักษาได้มากกว่า หนึ่งในนั้นคือรหัสที่ประกาศ ประเด็นคือถามสิ่งที่คุณต้องการแทนที่จะไปที่นั่น

ในกรณีของคุณโดยเฉพาะอาจมีลักษณะดังต่อไปนี้ ก่อนอื่นคุณต้องหาว่ามันคืออะไรที่คุณกำลังค้นหานั่นคือค้นพบสิ่งที่เป็นนามธรรม ในกรณีของคุณดูเหมือนว่าคุณจำเป็นต้องมีวันที่ ไม่เพียง แต่วันที่เท่านั้น แต่ยังมีตัวแทนมาตรฐาน พูดว่าวันที่ ISO8601 มีการใช้งานอย่างน้อยสองรายการ: วันแรกคือวันที่แยกวิเคราะห์จากสตริงที่จัดรูปแบบ ISO8601 (หรือสตริงในรูปแบบอื่น ๆ จริง) และที่สองคือวันที่ในอนาคตซึ่งเป็นวันต่อมา ดังนั้นรหัสทั้งหมดอาจมีลักษณะเช่นนั้น:

(new Future(
    new DateTimeParsedFromISO8601('2009-09-30 20:24:00'),
    new OneDay()
))
    ->value();

สำหรับตัวอย่างเพิ่มเติมด้วยการเล่นปาหี่ datetime นี้

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