Aggiunta di un giorno a una data


172

Il mio codice per aggiungere un giorno a una data restituisce una data prima del giorno aggiungendo: la 2009-09-30 20:24:00data dopo l'aggiunta di un giorno DOVREBBE essere rinnovata al mese successivo: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;
?>

Ho usato un codice abbastanza simile prima, cosa sto facendo di sbagliato qui?

Risposte:


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

Per PHP 5.2.0+, puoi anche fare come segue:

$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
Grazie. Risolto come: $ stop_date = date ('Ymd H: i: s', strtotime ("$ stop_date + 1 day"));
Ian

11
Non dovresti usare una variabile in una stringa. Dovresti usare: date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));come nella risposta che @ w35l3y ti ha dato.
Cas Bloem,

È necessario aggiungere una chiamata alla funzione date_default_timezone_set prima di eseguire questo codice. Ad esempio aggiungi date_default_timezone_set ('Europa / Roma');
Luca Mastrostefano,

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

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

6
Questa è una soluzione -perfect- più recente.
Cas Bloem,

... Fintanto che non causa errori fatali quando viene eseguito sul tuo host;)
Henrik Erlandsson

Non scusarti. Alcune persone hanno pubblicato la risposta della signora 3 anni dopo averlo fatto
Mawg dice di ripristinare Monica il

1
È necessario aggiungere una chiamata alla funzione date_default_timezone_set prima di eseguire questo codice. Ad esempio aggiungi date_default_timezone_set ('Europa / Roma');
Luca Mastrostefano,

@LucaMastrostefano no, dovresti avere il fuso orario impostato sul tuo server ...
MH,

28

La soluzione più semplice:

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

Mi piace la tua strada in una foderaecho (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Aba,

@Aba Non credo che il tuo unico interlocutore funzioni nelle versioni precedenti di PHP perché l'ho provato e ho ricevuto un errore:Unexpected T_OBJECT_OPERATOR” error in PHP
Zachary Weixelbaum,

25

Ha funzionato per me: per la data attuale

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

per qualsiasi data:

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

2
grazie ha funzionato per me. La soluzione più semplice di tutte.
Puneet Verma,

2
non è necessario ripetere e nidificare strtotime(): può gestire tutto in una sola chiamata:date('Y-m-d', strtotime($date . " +1 day"));
billynoah,

2
Bello, questa è la soluzione più semplice! Grazie
Angelo,

7

Prova questo

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

Grazie compagno. Mi ha aiutato
Vandolph Reyes,

6

Modo semplice da leggere e comprendere:

$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
Questo a volte fallirà nelle modifiche dell'ora legale quando la lunghezza del giorno non è di 24 ore.
Nik Dow,

3

Aggiungo sempre solo 86400 (secondi in un giorno):

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

Non è il modo più semplice che potresti fare, ma funziona!


Come gestisci i secondi bisestili quando aggiungi 86400 non funzionerà perché ci sono 86401 secondi in quel giorno? (ok, so che succede solo ogni pochi anni, ma a seconda dell'app potrebbe essere importante)
Glen

1
Non tutti i giorni hanno 86400 secondi. In effetti, nella maggior parte dei posti negli Stati Uniti ci sono 3600 secondi in meno o aggiuntivi due volte all'anno.
Peter Kovacs,

1
Puoi tranquillamente ignorare i secondi saltati, come fa "Unix time". Questo è un po 'complicato, ma leggi questo articolo per maggiori informazioni: derickrethans.nl/leap_seconds_and_what_to_do_with_them.php
Christian Davén,

2
Dovresti evitare questa soluzione. Ecco perché: stackoverflow.com/questions/2613338/...
mspir

1
Non aggiungere la data aggiungendo 86400 secondi al giorno precedente! Avrai bug nel tuo codice! Questo non funziona nei giorni di ora legale!
sbrbot,

1

Mentre sono d'accordo con la risposta di Doug Hays, andrò qui per dire che il motivo per cui il tuo codice non funziona è perché strtotime () si aspetta un INT come secondo argomento, non una stringa (anche quella che rappresenta una data)

Se attivi la segnalazione degli errori max, vedrai questo come un errore "Un valore numerico non ben formato" che è di livello E_NOTICE.


1

Il modify()metodo che può essere utilizzato per aggiungere incrementi a un DateTimevalore esistente .

Crea un nuovo DateTimeoggetto con la data e l'ora correnti:

$due_dt = new DateTime();

Una volta che hai l' DateTimeoggetto, puoi manipolarne il valore aggiungendo o sottraendo periodi di tempo:

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

Puoi leggere di più sul Manuale PHP .


0

Il codice seguente ottiene il primo giorno di gennaio dell'anno corrente (ma può essere un'altra data) e aggiunge 365 giorni a quel giorno (ma può essere N numero di giorni) usando la classe DateTime e il suo metodo change () e format ( ):

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

0

Dato che hai già una risposta a ciò che non va nel tuo codice, posso portare un'altra prospettiva su come giocare con i tempi in generale e risolvere il tuo problema in modo specifico.

Spesso ti ritrovi a porre un problema in termini di soluzione. Questo è solo uno dei motivi per cui si finisce con un codice imperativo . È fantastico se funziona però; ci sono solo altre alternative, probabilmente più sostenibili. Uno di questi è un codice dichiarativo . Il punto è chiedere di cosa hai bisogno, invece di come arrivarci.

Nel tuo caso particolare, questo può apparire come il seguente. Innanzitutto, devi scoprire cosa cerchi, ovvero scoprire le astrazioni. Nel tuo caso, sembra che tu abbia bisogno di una data . Non solo una data, ma quella con una rappresentazione standard. Dì, data ISO8601. Esistono almeno due implementazioni: la prima è una data analizzata da una stringa formattata ISO8601 (o una stringa in qualsiasi altro formato in realtà), e la seconda è una data futura che è un giorno dopo. Pertanto, l'intero codice potrebbe apparire così:

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

Per altri esempi con giocoleria datetime, dai un'occhiata a questo .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.