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.

Respuestas:


147

Puedes probar:

print('Next Date ' . date('Y-m-d', strtotime('-1 day', strtotime($date_raw))));

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


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.


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');

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


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

¡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"));

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


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"))


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

Esto no es PHP.
Atheaos
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.