เพิ่ม 1 วันเป็นค่ารูปแบบ DATETIME


88

ในบางสถานการณ์ฉันต้องการเพิ่ม 1 วันให้กับค่าของตัวแปรที่จัดรูปแบบ DATETIME ของฉัน:

$start_date = date('Y-m-d H:i:s', strtotime("{$_GET['start_hours']}:{$_GET['start_minutes']} {$_GET['start_ampm']}"));

วิธีที่ดีที่สุดในการทำคืออะไร?

คำตอบ:


64

หากคุณต้องการทำใน PHP:

// replace time() with the time stamp you want to add one day to
$startDate = time();
date('Y-m-d H:i:s', strtotime('+1 day', $startDate));

หากคุณต้องการเพิ่มวันที่ใน MySQL:

-- replace CURRENT_DATE with the date you want to add one day to
SELECT DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY);

จะไม่ให้เวลาปัจจุบันแก่ฉันหรือ ฉันยังคงต้องให้ผู้ใช้ของฉันป้อนเวลา
ian

ใช่ แต่ฉันทำเครื่องหมายไว้ว่าคุณควรเปลี่ยนค่าใดเป็นเวลาที่กำหนดเอง คุณสามารถแทนที่time()ด้วยstrtotime("{$_GET['start_hours']}:{$_GET['start_minutes']} {$_GET['start_ampm']}").
RaYell

นี่ไม่ใช่ฤดูร้อน / ฤดูหนาวบันทึก! โปรดใช้ DST บันทึกการจัดการวันที่ / เวลา
สตีเวน

210

มีอีกวิธีหนึ่งในการดำเนินการกับDateTimeซึ่งเปิดตัวใน PHP 5.2 ซึ่งแตกต่างจากการใช้strtotime()สิ่งนี้จะบันทึกเวลาออมแสงและปีอธิกสุรทิน

$datetime = new DateTime('2013-01-29');
$datetime->modify('+1 day');
echo $datetime->format('Y-m-d H:i:s');

// Available in PHP 5.3

$datetime = new DateTime('2013-01-29');
$datetime->add(new DateInterval('P1D'));
echo $datetime->format('Y-m-d H:i:s');

// Available in PHP 5.4

echo (new DateTime('2013-01-29'))->add(new DateInterval('P1D'))->format('Y-m-d H:i:s');

// Available in PHP 5.5

$start = new DateTimeImmutable('2013-01-29');
$datetime = $start->modify('+1 day');
echo $datetime->format('Y-m-d H:i:s');

อาเป็นห่วงห่วงดา
Funk Forty Niner

9
หากเพิ่มมากกว่าหนึ่งวันคุณสามารถใช้พหูพจน์หรือเอกพจน์และได้ผลลัพธ์เดียวกันเช่น: +2 dayหรือ+2 days(เห็นได้ชัดว่า+2 daysถูกต้องตามความหมายมากกว่า)
timhc22

อะไรคือความแตกต่างในทางปฏิบัติระหว่างวิธีการเหล่านี้? ตัวอย่างแรกดูเหมือนง่ายและมีความหมายที่สุดสำหรับฉัน
BadHorsie

24

DateTimestring timeคอนสตรัคใช้เวลาพารามิเตอร์ $timeอาจเป็นสิ่งที่แตกต่างกันก็ต้องเคารพรูปแบบวันที่และเวลา

มีค่าที่ถูกต้องเป็นตัวอย่าง:

  • 'now' (ค่าเริ่มต้น)
  • 2017-10-19
  • 2017-10-19 11:59:59
  • 2017-10-19 +1day

ดังนั้นในกรณีของคุณคุณสามารถใช้สิ่งต่อไปนี้

$dt = new \DateTime('now +1 day'); //Tomorrow
$dt = new \DateTime('2016-01-01 +1 day'); //2016-01-02

3
ตอบโดยไม่มีคำอธิบาย? อ่านฉันจะเขียนคำตอบที่ดีได้อย่างไร?
Shashanth

11
  1. ใช้strtotimeเพื่อแปลงสตริงเป็นการประทับเวลา
  2. เพิ่มวันเข้าไป (เช่นเพิ่ม 86400 วินาที (24 * 60 * 60))

เช่น:

$time = strtotime($myInput);
$newTime = $time + 86400;

หากเพิ่มเพียง 1 วันการใช้ strtotime อีกครั้งอาจจะมากเกินไป


ดังนั้นฉันต้องแปลงเป็น TIMESTAMP แล้วกลับเป็นรูปแบบ DATETIME หรือไม่
ian

4
ฉันเดาว่าควรสังเกตด้วยว่าไม่ใช่ว่าทุกวันจะมีความยาว 24 ชั่วโมง ในสถานที่ส่วนใหญ่ในโลกการออมแสง (เวลาฤดูร้อน) หมายความว่าหนึ่งวันต่อปีมีเพียง 23 ชั่วโมงและวันอื่น ๆ คือ 25 ชั่วโมง
nickf

อัพ คุณแปลงวันที่และเวลาเป็นการประทับเวลาดังนั้นจึงอิงตาม UTC และวันUTCจะยาว 24 ชั่วโมงเสมอ เมื่อแปลงกลับด้วยdate()เขตเวลาท้องถิ่นจะถูกนำมาพิจารณาซึ่งจะดูแลการออมแสง
rabudde


1

ผมขอแนะนำให้เริ่มใช้Zend_DateเรียนจากZend Framework ฉันรู้ว่ามันค่อนข้างผิดปกติ แต่ฉันจะชอบวิธีนี้ :-)

$date = new Zend_Date();
$date->add('24:00:00', Zend_Date::TIMES);
print $date->get();

คุณช่วยดู (quesiton) ของฉัน [ stackoverflow.com/q/61421783/8919244] ได้ไหม
Moeez

1

คุณสามารถใช้ดังต่อไปนี้

$start_date = date('Y-m-d H:i:s');
$end_date = date("Y-m-d 23:59:59", strtotime('+3 days', strtotime($start_date)));

คุณยังสามารถตั้งค่าวันเป็นค่าคงที่และใช้ดังนี้

if (!defined('ADD_DAYS')) define('ADD_DAYS','+3 days');
$end_date = date("Y-m-d 23:59:59", strtotime(ADD_DAYS, strtotime($start_date)));

0

ใช้เวลาขอเซิร์ฟเวอร์เพื่อเพิ่มวัน ทำงานตามที่คาดไว้

25/08/19 => 27/09/19

$timestamp = $_SERVER['REQUEST_TIME'];
$dateNow = date('d/m/y', $timestamp);
$newDate = date('d/m/y', strtotime('+2 day', $timestamp));

ที่นี่ '+2 วัน' เพื่อเพิ่มจำนวนวัน


0

มีวิธีเพิ่มวันใน php date ที่กระชับและใช้งานง่ายกว่า อย่าเข้าใจฉันผิดนิพจน์ php เหล่านั้นดีมาก แต่คุณต้อง google เสมอว่าจะปฏิบัติอย่างไร ฉันพลาดสิ่งอำนวยความสะดวกในการเติมอัตโนมัติสำหรับสิ่งนั้น

นี่คือวิธีที่ฉันชอบจัดการกับกรณีเหล่านี้:

(new Future(
    new DateTimeFromISO8601String('2014-11-21T06:04:31.321987+00:00'),
    new OneDay()
))
    ->value();

สำหรับฉันมันเป็นวิธีที่ง่ายกว่าและการเติมข้อความอัตโนมัติทำงานนอกกรอบ ไม่จำเป็นต้องใช้ Google สำหรับการแก้ปัญหาในแต่ละครั้ง

เป็นโบนัสที่ดีคุณไม่ต้องกังวลกับการจัดรูปแบบค่าที่ได้เนื่องจากเป็นรูปแบบ ISO8601 อยู่แล้ว

นี่คือห้องสมุดเมอแรงค์มีตัวอย่างอื่น ๆ อีกมากมายที่นี่

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