menambahkan 1 hari ke nilai format DATETIME

88

Dalam situasi tertentu saya ingin menambahkan 1 hari ke nilai variabel berformat DATETIME saya:

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

Apa cara terbaik untuk melakukannya?

ian
sumber

Jawaban:

64

Jika Anda ingin melakukan ini di 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));

Jika Anda ingin menambahkan tanggal di MySQL:

-- replace CURRENT_DATE with the date you want to add one day to
SELECT DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY);
RaYell
sumber
Bukankah ini akan memberi saya waktu saat ini? saya masih perlu menjaga waktu yang dimasukkan pengguna.
ian
Ya itu akan tetapi saya menandai Anda nilai apa yang harus Anda ubah ke waktu khusus. Anda bisa mengganti time()dengan strtotime("{$_GET['start_hours']}:{$_GET['start_minutes']} {$_GET['start_ampm']}").
RaYell
ini bukan musim panas- / musim dingin simpan! Silakan gunakan manipulasi tanggal / waktu penyimpanan DST
steven
210

Ada lebih dari satu cara untuk melakukan ini dengan DateTime yang diperkenalkan di PHP 5.2. Tidak seperti menggunakan strtotime()ini akan memperhitungkan waktu musim panas dan tahun kabisat.

$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');
John Conde
sumber
Ah, lingkaran da loop .
Funk Forty Niner
9
Jika menambahkan lebih dari satu hari, Anda dapat menggunakan bentuk jamak atau tunggal dan mendapatkan hasil yang sama misalnya: +2 dayatau +2 days(jelas +2 dayslebih semantik benar)
timhc22
Apa perbedaan praktis antara metode ini? Contoh pertama tampaknya yang paling sederhana dan paling semantik bagi saya.
BadHorsie
24

The DateTime konstruktor mengambil parameter string time. $timebisa menjadi hal yang berbeda, itu harus menghormati format datetime .

Ada beberapa nilai yang valid sebagai contoh:

  • 'now' (nilai default)
  • 2017-10-19
  • 2017-10-19 11:59:59
  • 2017-10-19 +1day

Jadi, dalam kasus Anda, Anda dapat menggunakan yang berikut ini.

$dt = new \DateTime('now +1 day'); //Tomorrow
$dt = new \DateTime('2016-01-01 +1 day'); //2016-01-02
Dmitry
sumber
3
Menjawab tanpa penjelasan? Baca Bagaimana cara menulis jawaban yang baik?
Shashanth
11
  1. Gunakan strtotimeuntuk mengubah string menjadi cap waktu
  2. Tambahkan satu hari ke dalamnya (misalnya: dengan menambahkan 86400 detik (24 * 60 * 60))

misalnya:

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

Jika hanya menambahkan 1 hari, maka menggunakan strtotime lagi mungkin berlebihan.

nickf
sumber
Jadi saya perlu mengubahnya menjadi TIMESTAMP lalu kembali ke format DATETIME?
ian
4
Saya rasa perlu juga dicatat bahwa tidak setiap hari panjangnya 24 jam. Di banyak tempat di dunia, pergeseran waktu siang hari (waktu musim panas) berarti bahwa satu hari dalam setahun hanya 23 jam, dan satu hari lagi 25 jam.
nickf
UPS. Anda mengonversi waktu ke waktu menjadi stempel waktu, jadi ini berbasis UTC. Dan hari-hari UTC selalu sepanjang 24 jam. Saat mengonversi kembali dengan date()zona waktu lokal diperhitungkan yang akan menangani pergeseran waktu siang hari.
rabudde
5

Kamu dapat memakai

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

Saya sarankan mulai menggunakan kelas Zend_Date dari Zend Framework . Saya tahu, ini agak offtopic, tapi saya akan suka cara ini :-)

$date = new Zend_Date();
$date->add('24:00:00', Zend_Date::TIMES);
print $date->get();
Pawka
sumber
dapatkah Anda melihat (quesiton) terkait saya [ stackoverflow.com/q/61421783/8919244] ?
Moeez
1

Anda dapat menggunakan sebagai berikut.

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

Anda juga dapat mengatur hari sebagai konstan dan menggunakan seperti di bawah ini.

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

Menggunakan waktu permintaan server untuk Menambahkan hari. Bekerja seperti yang diharapkan.

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

Di sini '+2 hari' untuk menambahkan sejumlah hari.

Niroshan
sumber
0

Ada cara yang lebih ringkas dan intuitif untuk menambahkan hari ke tanggal php. Jangan salah paham, ekspresi php itu bagus, tetapi Anda selalu harus mencari cara mengatasinya di Google. Saya rindu fasilitas auto-complete untuk itu.

Inilah cara saya menangani kasus tersebut:

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

Bagi saya, ini jauh lebih intuitif dan pelengkapan otomatis bekerja di luar kotak. Tidak perlu google untuk mencari solusinya setiap saat.

Sebagai bonus bagus, Anda tidak perlu khawatir tentang memformat nilai yang dihasilkan, ini sudah dalam format ISO8601.

Ini adalah perpustakaan meringue, ada lebih banyak contoh di sini .

Vadim Samokhin
sumber