Agregar un día a una fecha

172

Mi código para agregar un día a una fecha devuelve una fecha antes de agregar el día: la 2009-09-30 20:24:00fecha después de agregar un día DEBERÍA pasar al mes siguiente: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;
?>

He usado un código bastante similar antes, ¿qué estoy haciendo mal aquí?

ian
fuente

Respuestas:

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

Para PHP 5.2.0+, también puede hacer lo siguiente:

$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
fuente
3
Gracias. Lo resolvió como: $ stop_date = date ('Ymd H: i: s', strtotime ("$ stop_date + 1 day"));
ian
11
No debe usar una variable en una cadena. Deberías usar: date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));como en la respuesta que @ w35l3y te dio.
Cas Bloem
Debe agregar una llamada a la función date_default_timezone_set antes de ejecutar este código. Por ejemplo, agregue 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";
Prasanth Bendra
fuente
66
Esta es una solución más reciente -perfecta-.
Cas Bloem
... Siempre que no cause errores fatales cuando se ejecuta en su host;)
Henrik Erlandsson
No te disculpes. Algunas personas publicaron la respuesta de la dama 3 años después de que lo hiciste
Mawg dice que reinstalar a Monica
1
Debe agregar una llamada a la función date_default_timezone_set antes de ejecutar este código. Por ejemplo, agregue date_default_timezone_set ('Europa / Roma');
Luca Mastrostefano
@LucaMastrostefano no, debe tener la zona horaria configurada en su servidor ...
MH
28

La solución más simple:

$date = new DateTime('+1 day');
echo $date->format('Y-m-d H:i:s');
minlare
fuente
Me gusta tu manera en un trazador de líneasecho (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Aba
@Aba No creo que tu único liner funcione en versiones anteriores de PHP porque lo probé y recibí un error:Unexpected T_OBJECT_OPERATOR” error in PHP
Zachary Weixelbaum
25

A mí me funcionó: para la fecha actual

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

para cualquier fecha:

date('Y-m-d', strtotime("+1 day", strtotime($date)));
Jay Momaya
fuente
2
gracias funcionó para mí La solución más simple de todas.
Puneet Verma
2
que no es necesario repetir y nido strtotime()- que puede manejar todo en una sola llamada:date('Y-m-d', strtotime($date . " +1 day"));
billynoah
2
Bien, ¡esta es la solución más simple! Gracias
Angel
7

Prueba esto

echo date('Y-m-d H:i:s',date(strtotime("+1 day", strtotime("2009-09-30 20:24:00"))));
user1987095
fuente
Gracias amigo. Me ayudó.
Vandolph Reyes
6

Fácil de leer y entender:

$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
fuente
3
Esto a veces fallará en los cambios de horario de verano cuando la duración del día no sea de 24 horas.
Nik Dow
3

Siempre agrego 86400 (segundos en un día):

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

No es la forma más hábil en la que probablemente puedas hacerlo, ¡pero funciona!

Doug Hays
fuente
¿Cómo lidias con los segundos bisiestos cuando agregar 86400 no funcionará ya que hay 86401 segundos en ese día? (ok, sé que sólo ocurre cada pocos años, pero dependiendo de la aplicación que esto podría ser importante)
Glen
1
No todos los días tienen 86400 segundos en ellos. De hecho, en la mayoría de los lugares en los Estados Unidos hay 3600 segundos menos o más dos veces al año.
Peter Kovacs
1
Puede ignorar con seguridad los segundos bisiestos, ya que el "tiempo Unix" sí. Esto es algo complicado, pero lea este artículo para obtener más información: derickrethans.nl/leap_seconds_and_what_to_do_with_them.php
Christian Davén
2
Debes evitar esta solución. Aquí es por qué: stackoverflow.com/questions/2613338/…
mspir
1
¡No agregue la fecha agregando 86400 segundos al día anterior! ¡Tendrás un error en tu código! ¡Esto no funciona en los días de verano!
sbrbot
1

Si bien estoy de acuerdo con la respuesta de Doug Hays, intervino aquí para decir que la razón por la que su código no funciona es porque strtotime () espera un INT como el segundo argumento, no una cadena (incluso una que represente una fecha)

Si activa el informe de error máximo, verá esto como un error de "Un valor numérico no bien formado" que es el nivel E_NOTICE.

Peter Bailey
fuente
1

El modify()método que se puede usar para agregar incrementos a un DateTimevalor existente .

Cree un nuevo DateTimeobjeto con la fecha y hora actuales:

$due_dt = new DateTime();

Una vez que tenga el DateTimeobjeto, puede manipular su valor sumando o restando períodos de tiempo:

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

Puedes leer más en el Manual PHP .

Kal
fuente
0

El siguiente código obtiene el primer día de enero del año actual (pero puede ser otra fecha) y agrega 365 días a ese día (pero puede ser N número de días) usando la clase DateTime y su método modify () y format ( ):

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
fuente
0

Dado que ya tiene una respuesta a lo que está mal con su código, puedo brindarle otra perspectiva sobre cómo puede jugar con fechas y horas en general, y resolver su problema específicamente.

A menudo te encuentras planteando un problema en términos de solución. Esta es solo una de las razones por las que terminas con un código imperativo . Sin embargo, es genial si funciona; hay otras alternativas, posiblemente más mantenibles. Uno de ellos es un código declarativo . El punto es preguntar qué necesitas, en lugar de cómo llegar allí.

En su caso particular, esto puede parecerse a lo siguiente. Primero, necesitas descubrir qué es lo que estás buscando, es decir, descubrir abstracciones. En su caso, parece que necesita una cita . No cualquier fecha, sino la que tiene alguna representación estándar. Digamos, fecha ISO8601. Hay al menos dos implementaciones: la primera es una fecha analizada desde una cadena con formato ISO8601 (o una cadena en cualquier otro formato en realidad), y la segunda es una fecha futura que es un día después. Por lo tanto, todo el código podría verse así:

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

Para obtener más ejemplos con malabares de fecha y hora, consulte este .

Vadim Samokhin
fuente