Restar 1 día con PHP

83

Estoy tratando de tomar un objeto de fecha que sale de mi CMS de Drupal, restar un día e imprimir ambas fechas. Esto es lo que tengo

$date_raw = $messagenode->field_message_date[0]['value'];

print($date_raw);

//this gives me the following string: 2011-04-24T00:00:00

$date_object = date_create($date_raw);

$next_date_object = date_modify($date_object,'-1 day');

print('First Date ' . date_format($date_object,'Y-m-d'));

//this gives me the correctly formatted string '2011-04-24'

print('Next Date ' . date_format($next_date_object,'Y-m-d'));

//this gives me nothing. The output here is always blank

Así que no entiendo por qué el objeto de fecha original está saliendo bien, pero luego estoy tratando de crear un objeto de fecha adicional y modificarlo restando un día y parece que no puedo hacer eso. La salida siempre sale en blanco.

td-dev
fuente

Respuestas:

147

Puedes probar:

print('Next Date ' . date('Y-m-d', strtotime('-1 day', strtotime($date_raw))));
MasterCassim
fuente
1
Puede obtener el mismo formato $ date_raw con$date_raw = date("r");
sHaDeoNeR
5
¡Ten cuidado! Si maneja fechas posteriores a 2038 , no funcionará debido al límite de tamaño entero en PHP (al menos en una plataforma de 32 bits). En ese caso, la solución más segura es usar DateTime( ver aquí ).
Tip-Sy
61
 date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
Yo creo que
fuente
36
$date = new DateTime("2017-05-18"); // For today/now, don't pass an arg.
$date->modify("-1 day");
echo $date->format("Y-m-d H:i:s");

El uso de DateTime ha reducido significativamente la cantidad de dolores de cabeza que se sufren al manipular las fechas.

Aberdat
fuente
6
date_createes el método de procedimiento para invocar el DateTimeconstructor , que le permite reducir sus 3 líneas en 1 sin usar new. Es decirecho date_create('2017-05-18')->modify('-1 day')->format('Y-m-d H:i:s');
Armfoot
bueno, el código de la respuesta original también se puede escribir en 1 línea, como:(new \DateTime("2017-05-18"))->modify("-1 day")->format("Y-m-d H:i:s")
Scofield
22

Versión orientada a objetos

$dateObject = new DateTime( $date_raw );
print('Next Date ' . $dateObject->sub( new DateInterval('P1D') )->format('Y-m-d');
Cosmitar
fuente
su respuesta suma un día en lugar de restarlo. Aparte de eso, sería mi solución preferida.
Burki
18

Una opción de una sola línea es:

echo date_create('2011-04-24')->modify('-1 days')->format('Y-m-d');

Ejecutarlo en el Editor PHP en línea .


alternativa mktime

Si prefiere evitar el uso de métodos de cadena, o entrar en cálculos, o incluso crear variables adicionales, mktime admite restas y valores negativos de la siguiente manera:

// Today's date
echo date('Y-m-d'); // 2016-03-22

// Yesterday's date
echo date('Y-m-d', mktime(0, 0, 0, date("m"), date("d")-1, date("Y"))); // 2016-03-21

// 42 days ago
echo date('Y-m-d', mktime(0, 0, 0, date("m"), date("d")-42, date("Y"))); // 2016-02-09

//Using a previous date object
$date_object = new DateTime('2011-04-24');
echo date('Y-m-d',
  mktime(0, 0, 0,
     $date_object->format("m"),
     $date_object->format("d")-1,
     $date_object->format("Y")
    )
); // 2011-04-23

Editor PHP en línea

Armfoot
fuente
13

No estoy seguro de por qué su código actual no funciona, pero si no necesita específicamente un objeto de fecha, esto funcionará:

$first_date = strtotime($date_raw);
$second_date = strtotime('-1 day', $first_date);

print 'First Date ' . date('Y-m-d', $first_date);
print 'Next Date ' . date('Y-m-d', $second_date);
Clive
fuente
¡Gracias Clive! Ese funcionó para mí ... sí, realmente no necesitaba objetos de fecha, solo necesitaba imprimir las fechas formateadas.
td-dev
7

Answear tomado de los comentarios de la función strtotime manual de Php:

echo date( "Y-m-d", strtotime( "2009-01-31 -1 day"));

O

$date = "2009-01-31";
echo date( "Y-m-d", strtotime( $date . "-1 day"));
cuperto
fuente
3

¿Qué tal esto? Conviértalo primero a una marca de tiempo Unix, reste 60 * 60 * 24 (exactamente un día en segundos) y luego tome la fecha de eso.

$newDate = strtotime($date_raw) - 60*60*24;
echo date('Y-m-d',$newDate);

Nota: como ha señalado apokryfos, esto técnicamente se desviaría por los cambios de horario de verano donde habría un día con 25 o 23 horas

usuario3413723
fuente
Buena, solo que lo hice así: $ newDate = date_create ($ date_raw) -> getTimestamp () - 60 * 60 * 24;
Yevgeniy Afanasyev
Esto supone que todos los días duran 24 horas, lo que no es cierto en esos 2 días cuando una minoría del mundo mueve sus relojes en +/- 1 hora para proporcionar una ilusión de más o menos luz solar. Y luego también están los segundos intercalares.
apokryfos
esa es una gran captura @apokryfos. No usaría esto para un cálculo súper científico, pero en la gran mayoría de los casos debería estar bien.
user3413723
3

Tan simple como eso:

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

date("Y-m-d", strtotime("-1 months"))

Militaru
fuente
-1

Cómo agregar 1 año a una fecha y luego restarle 1 día en asp.net c #

Convert.ToDateTime(txtDate.Value.Trim()).AddYears(1).AddDays(-1);
Código
fuente
Esto no es PHP.
Atheaos