Menambahkan satu hari ke tanggal

172

Kode saya untuk menambahkan satu hari ke tanggal mengembalikan tanggal sebelum menambahkan: 2009-09-30 20:24:00tanggal setelah menambahkan satu hari HARUS digulung ke bulan berikutnya: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;
?>

Saya telah menggunakan kode yang sangat mirip sebelumnya, apa yang saya lakukan salah di sini?

ian
sumber

Jawaban:

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

Untuk PHP 5.2.0+, Anda juga dapat melakukan hal berikut:

$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');
w35l3y
sumber
3
Terima kasih. Dipecahkan sebagai: $ stop_date = date ('Ymd H: i: s', strtotime ("$ stop_date + 1 hari"));
ian
11
Anda seharusnya tidak menggunakan variabel dalam string. Anda harus menggunakan: date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));seperti pada jawaban yang diberikan @ w35l3y kepada Anda.
Cas Bloem
Anda harus menambahkan fungsi call to date_default_timezone_set sebelum menjalankan kode ini. Misalnya menambahkan date_default_timezone_set ('Eropa / Roma');
Luca Mastrostefano
96
$date = new DateTime('2000-12-31');

$date->modify('+1 day');
echo $date->format('Y-m-d') . "\n";
Prasanth Bendra
sumber
6
Ini adalah solusi yang lebih baru-sempurna-.
Cas Bloem
... Selama itu tidak menyebabkan kesalahan fatal ketika dijalankan pada host Anda;)
Henrik Erlandsson
Jangan minta maaf. Beberapa orang memposting jawaban dame 3 tahun setelah Anda melakukannya
Mawg mengatakan mengembalikan Monica
1
Anda harus menambahkan fungsi call to date_default_timezone_set sebelum menjalankan kode ini. Misalnya menambahkan date_default_timezone_set ('Eropa / Roma');
Luca Mastrostefano
@LucaMastrostefano tidak, Anda harus mengatur zona waktu di server Anda ...
MH
28

Solusi paling sederhana:

$date = new DateTime('+1 day');
echo $date->format('Y-m-d H:i:s');
minlare
sumber
Saya suka jalan Anda dalam satu linerecho (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Aba
@Aba Saya tidak berpikir satu liner Anda berfungsi di versi PHP yang lebih lama karena saya mencobanya dan saya mendapat kesalahan:Unexpected T_OBJECT_OPERATOR” error in PHP
Zachary Weixelbaum
25

Ini Berhasil untuk Saya: Untuk Tanggal Sekarang

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

untuk setiap tanggal:

date('Y-m-d', strtotime("+1 day", strtotime($date)));
Jay Momaya
sumber
2
terima kasih itu berhasil untuk saya. Sederhana dari semua solusi yang diberikan.
Puneet Verma
2
Anda tidak perlu mengulangi dan membuat sarang strtotime()- sarang dapat menangani semuanya dalam satu panggilan:date('Y-m-d', strtotime($date . " +1 day"));
billynoah
2
Bagus, ini solusi paling sederhana! Terima kasih
Malaikat
7

Coba ini

echo date('Y-m-d H:i:s',date(strtotime("+1 day", strtotime("2009-09-30 20:24:00"))));
pengguna1987095
sumber
Terima kasih sobat. Itu membantu saya.
Vandolph Reyes
6

Mudah dibaca dan dimengerti caranya:

$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;
joan16v
sumber
3
Ini kadang-kadang akan gagal pada perubahan penghematan siang hari ketika panjang hari tidak 24 jam.
Nik Dow
3

Saya selalu menambahkan 86400 (detik dalam sehari):

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

Ini mungkin bukan cara paling licik yang Anda bisa lakukan, tetapi berhasil!

Doug Hays
sumber
Bagaimana Anda menangani detik kabisat saat menambahkan 86400 tidak akan berfungsi karena ada 86401 detik di hari itu? (ok, saya tahu itu hanya terjadi setiap beberapa tahun, tetapi tergantung pada aplikasinya, ini mungkin penting)
Glen
1
Tidak semua hari memiliki 86400 detik di dalamnya. Bahkan, di sebagian besar tempat di AS ada 3600 lebih sedikit atau tambahan detik dua kali setahun.
Peter Kovacs
1
Anda dapat dengan aman mengabaikan detik kabisat, karena "Waktu Unix" tidak. Ini agak rumit, tetapi baca artikel ini untuk info lebih lanjut: derickrethans.nl/leap_seconds_and_what_to_do_with_them.php
Christian Davén
2
Anda harus menghindari solusi ini. Inilah sebabnya: stackoverflow.com/questions/2613338/…
mspir
1
Jangan tambahkan tanggal dengan menambahkan 86400 detik ke hari sebelumnya! Anda akan memiliki bug dalam kode Anda! Ini tidak berfungsi pada hari Musim Panas!
sbrbot
1

Sementara saya setuju dengan jawaban Doug Hays, saya akan berpadu di sini untuk mengatakan bahwa alasan kode Anda tidak berfungsi adalah karena strtotime () mengharapkan INT sebagai argumen ke-2, bukan string (bahkan string yang mewakili tanggal)

Jika Anda mengaktifkan pelaporan kesalahan maks, Anda akan melihat ini sebagai kesalahan "Nilai numerik yang tidak terbentuk dengan baik" yang merupakan level E_NOTICE.

Peter Bailey
sumber
1

The modify()metode yang dapat digunakan untuk menambah bertahap ke yang ada DateTimenilai.

Buat DateTimeobjek baru dengan tanggal dan waktu saat ini:

$due_dt = new DateTime();

Setelah Anda memiliki DateTimeobjek, Anda dapat memanipulasi nilainya dengan menambahkan atau mengurangi periode waktu:

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

Anda dapat membaca lebih lanjut di Manual PHP .

Kal
sumber
0

Kode berikut mendapatkan hari pertama bulan Januari tahun ini (tetapi ini bisa menjadi tanggal lain) dan menambahkan 365 hari ke hari itu (tetapi bisa menjadi N jumlah hari) menggunakan kelas DateTime dan metodenya memodifikasi () dan memformat () ):

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

Karena Anda sudah memiliki jawaban untuk apa yang salah dengan kode Anda, saya dapat membawa perspektif lain tentang bagaimana Anda dapat bermain dengan data secara umum, dan menyelesaikan masalah Anda secara khusus.

Seringkali Anda menemukan diri Anda menimbulkan masalah dalam hal solusi. Ini hanya salah satu alasan Anda berakhir dengan kode imperatif . Sangat bagus jika bekerja; ada alternatif lain yang bisa dipertahankan. Salah satunya adalah kode deklaratif . Intinya adalah menanyakan apa yang Anda butuhkan, alih-alih bagaimana menuju ke sana.

Dalam kasus khusus Anda, ini bisa terlihat seperti berikut. Pertama, Anda perlu mencari tahu apa yang Anda cari, yaitu menemukan abstraksi. Dalam kasus Anda, sepertinya Anda perlu kencan . Bukan sembarang tanggal, tetapi yang memiliki representasi standar. Katakanlah, tanggal ISO8601. Setidaknya ada dua implementasi: yang pertama adalah tanggal diuraikan dari string berformat ISO8601 (atau string dalam format lain sebenarnya), dan yang kedua adalah beberapa tanggal di masa depan yang merupakan hari kemudian. Dengan demikian, keseluruhan kode dapat terlihat seperti itu:

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

Untuk lebih banyak contoh dengan juggling datetime, periksa yang ini .

Vadim Samokhin
sumber