Bir tarihe bir gün ekleme


172

Bir tarihe bir gün eklemek için kullandığım kod, gün ekleme tarihinden önceki bir tarih döndürüyor: bir gün ekledikten 2009-09-30 20:24:00sonraki tarih bir sonraki aya devredilmeli: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;
?>

Daha önce benzer kod kullandım, burada neyi yanlış yapıyorum?

Yanıtlar:


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+ için ayrıca şunları da yapabilirsiniz:

$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
Teşekkürler. Çözüldü: $ stop_date = tarih ('Ymd H: i: s', strtotime ("$ stop_date + 1 gün"));
ian

11
Dizede bir değişken kullanmamalısınız. Kullanmalısınız: date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));@ w35l3y'nin verdiği cevapta olduğu gibi.
Cas Bloem

Bu kodu çalıştırmadan önce date_default_timezone_set işlevine bir çağrı eklemelisiniz. Örneğin date_default_timezone_set ('Avrupa / Roma') ekleyin;
Luca Mastrostefano

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

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

6
Bu daha yeni bir mükemmel çözümdür.
Cas Bloem

... Ev sahibi üzerinde çalışırken ölümcül hatalara neden olmadıkça;)
Henrik Erlandsson

Özür dileme. Bazı insanlar sizden 3 yıl sonra dame cevabını yayınladılar
Mawg, Monica'yı

1
Bu kodu çalıştırmadan önce date_default_timezone_set işlevine bir çağrı eklemelisiniz. Örneğin date_default_timezone_set ('Avrupa / Roma') ekleyin;
Luca Mastrostefano

@LucaMastrostefano hayır, saat diliminizi sunucunuzda ayarlamanız gerekir ...
MH

28

En basit çözüm:

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

Tek bir astarda yolunu seviyorumecho (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Aba

@Aba denediğim için bir liner PHP'nin eski sürümlerinde çalıştığını sanmıyorum ve bir hata aldım:Unexpected T_OBJECT_OPERATOR” error in PHP
Zachary Weixelbaum

25

Benim için çalıştı: Güncel Tarih İçin

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

herhangi bir tarih için:

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

2
teşekkürler benim için çalıştı. Verilen tüm çözümlerden en basitidir.
Puneet Verma

2
tekrarlamak ve yuvalamak gerekmez strtotime()- tek bir çağrıda her şeyi işleyebilir:date('Y-m-d', strtotime($date . " +1 day"));
billynoah

2
Güzel, Bu en basit çözüm! Teşekkür ederim
Angel

7

Bunu dene

echo date('Y-m-d H:i:s',date(strtotime("+1 day", strtotime("2009-09-30 20:24:00"))));

Teşekkürler dostum. Bana yardımcı oldu.
Vandolph Reyes

6

Okuması ve anlaması kolay:

$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
Bu, gün uzunluğu 24 saat olmadığında gün ışığından yararlanma değişikliklerinde bazen başarısız olur.
Nik Dow

3

Her zaman sadece 86400 (günde saniye) ekliyorum:

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

Muhtemelen yapabileceğiniz en şık yol değil, ama işe yarıyor!


86400 eklerken o gün 86401 saniye olduğu için çalışmayan saniye ile nasıl başa çıkıyorsunuz? (tamam, sadece birkaç yılda bir olduğunu biliyorum, ama uygulamaya bağlı olarak bu önemli olabilir)
Glen

1
Tüm günlerde 86400 saniye yoktur. Aslında, ABD'deki çoğu yerde yılda iki kez 3600 daha az veya ek saniye var.
Peter Kovacs

1
"Unix zamanı" yapıldığından, artık saniyeleri güvenle yok sayabilirsiniz. Bu biraz karmaşık, ancak daha fazla bilgi için bu makaleyi okuyun: derickrethans.nl/leap_seconds_and_what_to_do_with_them.php
Christian Davén

2
Bu çözümden kaçınmalısınız.
Nedeni

1
Önceki güne 86400 saniye ekleyerek tarih eklemeyin! Kodunuzda hata olacak! Bu, Yaz Saati uygulamasında çalışmaz!
sbrbot

1

Doug Hays'ın cevabını kabul ederken, burada kodunuzun çalışmamasının nedeni, strtotime () ' ın bir dize değil (bir tarihi temsil eden bir tane bile ) bir INT'yi 2. argüman olarak beklemesi olduğunu söyleyeceğim.

Maks. Hata raporlamayı açarsanız, bunu E_NOTICE düzeyindeki "İyi biçimlendirilmemiş bir sayısal değer" hatası olarak görürsünüz.


1

modify()Mevcut bir kademeli yükselmeler eklemek için kullanılabilen usul DateTimedeğeri.

DateTimeGeçerli tarih ve saate sahip yeni bir nesne oluşturun :

$due_dt = new DateTime();

DateTimeNesneye sahip olduğunuzda, zaman aralıklarını ekleyerek veya çıkararak değerini değiştirebilirsiniz:

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

Daha fazla bilgiyi PHP El Kitabı'nda bulabilirsiniz .


0

Aşağıdaki kod, geçerli yılın Ocak ayının ilk gününü alır (ancak başka bir tarih olabilir) ve DateTime sınıfını ve yöntemini değiştir () ve biçimini () kullanarak o güne 365 gün ekler (ancak N gün olabilir) ):

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

0

Kodunuzda neyin yanlış olduğuna zaten bir cevabınız olduğundan, genellikle tarihlerle nasıl oynayabileceğinize ve sorununuzu özel olarak çözebileceğinize başka bir bakış açısı getirebilirim.

Çoğu zaman kendinizi çözüm açısından bir sorunla karşı karşıya bulursunuz. Bu, zorunlu bir kodla karşılaşmanızın nedenlerinden sadece biridir . Gerçi çalışırsa harika; başka, tartışmasız daha sürdürülebilir alternatifler var. Bunlardan biri bildirici bir koddur. Buradaki nokta, oraya nasıl ulaşmak yerine neye ihtiyacınız olduğunu sormak .

Sizin durumunuzda, bu aşağıdaki gibi görünebilir. İlk olarak, aradığınız şeyin ne olduğunu bulmanız , yani soyutlamaları keşfetmeniz gerekir. Sizin durumunuzda, bir tarihe ihtiyacınız var gibi görünüyor . Sadece herhangi bir tarih değil, standart bir temsile sahip olan. Diyelim ki ISO8601 tarihi. En az iki uygulama vardır: birincisi, ISO8601 biçimli bir dizeden (veya aslında başka bir biçimde bir dizeden) ayrıştırılan bir tarihtir ve ikincisi bir gün sonraki gelecekteki bir tarihtir. Böylece, tüm kod şöyle görünebilir:

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

Datetime hokkabazlık ile fazla örnek için kontrol bu bir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.