PHP, Dapatkan tanggal besok dari tanggal


89

Saya memiliki tanggal PHP dalam bentuk 2013-01-22dan saya ingin mendapatkan tanggal besok dalam format yang sama, jadi misalnya 2013-01-23.

Bagaimana ini mungkin dengan PHP?

Jawaban:


206

Gunakan DateTime

$datetime = new DateTime('tomorrow');
echo $datetime->format('Y-m-d H:i:s');

Atau:

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

Atau:

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

Atau dalam PHP 5.4+:

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

1
Ini menggunakan arus, saya harus lewat pada tanggal tertentu.
Justin

Cara ke-2 mungkin yang terbaik.
nickb

73
 $tomorrow = date("Y-m-d", strtotime('tomorrow'));

atau

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

Tautan Bantuan: STRTOTIME ()


1
Saya menggunakan yang ini dan dari semua jawaban adalah versi terpendek dan paling sederhana, terima kasih!
Bombelman

17

Karena Anda menandai ini dengan , Anda dapat menggunakannya dengan +1 daypengubah seperti ini:

$tomorrow_timestamp = strtotime('+1 day', strtotime('2013-01-22'));

Karena itu, ini adalah solusi yang jauh lebih baik untuk menggunakan DateTime .


14
<? php 

//1 Day = 24*60*60 = 86400

echo date("d-m-Y", time()+86400); 

?>

17
Perhatikan bahwa ini akan gagal dalam kasus edge (waktu musim panas).
JJJ

Jawaban ini salah. Saya memiliki cronjob yang menggunakan ini dalam satu lingkaran, dan sistem mati.
Jewelnguyen8


3

Penggunaan DateTime:

Untuk mendapatkan hari esok dari sekarang:

$d = new DateTime('+1day');
$tomorrow = $d->format('d/m/Y h.i.s');
echo $tomorrow;

Hasil: 28/06/2017 08.13.20

Untuk mendapatkan besok dari kencan:

$d = new DateTime('2017/06/10 08.16.35 +1day')
$tomorrow = $d->format('d/m/Y h.i.s');
echo $tomorrow;

Hasil: 11/06/2017 08.16.35

Semoga membantu!


1
/**
 * get tomorrow's date in the format requested, default to Y-m-d for MySQL (e.g. 2013-01-04)
 *
 * @param string
 *
 * @return string
 */
public static function getTomorrowsDate($format = 'Y-m-d')
{
    $date = new DateTime();
    $date->add(DateInterval::createFromDateString('tomorrow'));

    return $date->format($format);
}

1

Anehnya, sepertinya itu berfungsi dengan baik: date_create( '2016-02-01 + 1 day' );

echo date_create( $your_date . ' + 1 day' )->format( 'Y-m-d' );

Harus melakukannya


0

Pertama, menghasilkan abstraksi yang benar selalu menjadi kunci. kunci untuk keterbacaan, pemeliharaan, dan kemampuan diperpanjang.

Di sini, kandidat yang cukup jelas adalah seorang ISO8601DateTime. Setidaknya ada dua implementasi: yang pertama adalah waktu parsing dari string, dan yang kedua adalah besok. Oleh karena itu, ada dua kelas yang dapat digunakan, dan kombinasi keduanya menghasilkan (hampir) hasil yang diinginkan:

new Tomorrow(new FromISO8601('2013-01-22'));

Kedua objek tersebut adalah waktu tanggal ISO8601, jadi representasi tekstualnya tidak persis seperti yang Anda butuhkan. Jadi goresan terakhir adalah membuat mereka mengambil bentuk tanggal:

new Date(
    new Tomorrow(
        new FromISO8601('2013-01-22')
    )
);

Karena Anda membutuhkan representasi tekstual, bukan hanya sebuah objek, Anda memanggil sebuah value()metode.

Untuk lebih lanjut tentang pendekatan ini, lihat posting ini .


-1

inilah fungsi kerjanya

function plus_one_day($date){
 $date2 = formatDate4db($date);
 $date1 = str_replace('-', '/', $date2);
 $tomorrow = date('Y-m-d',strtotime($date1 . "+1 days"));
 return $tomorrow; }

apa yang dilakukan fungsi formatDate4db? Mengapa mengganti tanda hubung dengan garis miring pada string?
braindigitalis

fungsi formatDate4db melewatkan tanggal dan itu membuat format seperti format database mysql, dan fungsi str_replace, saya memiliki format tanggal 2019/12/10 dan mengganti dengan -
Muhammad Awais Zulifqar

-4
$date = '2013-01-22';
$time = strtotime($date) + 86400;
echo date('Y-m-d', $time);

Di mana 86400 adalah # detik dalam sehari.


11
Tidak, satu hari tidak selalu memiliki 86400 detik.
nickb

Saya tidak mengerti masalahnya. Tolong jelaskan @nickb
Aiyion.Prime

@ Aiyion. Hari-hari utama yang membuat peralihan ke atau dari waktu musim panas tidak memiliki waktu 86400 detik
dumazy

Saya memikirkan itu, DST dimulai pada jam dua dan oleh karena itu tidak boleh menghasilkan tanggal yang berbeda?
Aiyion.Prime

Masalahnya bukanlah penghematan siang hari. Waktu dalam database harus disimpan sebagai UTC yang tidak memiliki waktu musim panas. Jika Anda menyimpan tanggal Anda dalam UTC ini akan berfungsi dengan baik tetapi agak tumpul.
braindigitalis
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.