web-dev-qa-db-fra.com

Soustrayez 1 jour avec PHP

J'essaie de prendre un objet de date qui sort de mon Drupal), soustrayez un jour et imprimez les deux dates. Voici ce que j'ai

$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

Je ne comprends donc pas pourquoi l'objet de date d'origine est correct, mais j'essaie ensuite de créer un objet de date supplémentaire et de le modifier en le soustrayant un jour et il semble que je ne puisse pas le faire. La sortie est toujours vide.

69
td-dev

Tu peux essayer:

print('Next Date ' . date('Y-m-d', strtotime('-1 day', strtotime($date_raw))));
125
MasterCassim
 date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
59
iThink
$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");

L'utilisation de DateTime a considérablement réduit le nombre de maux de tête endurés lors de la manipulation des dates.

21
aberdat

Version orientée objet

$dateObject = new DateTime( $date_raw );
print('Next Date ' . $dateObject->sub( new DateInterval('P1D') )->format('Y-m-d');
19
Cosmitar

Une option à une ligne est:

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

L'exécuter sur en ligne PHP .


mktime alternative

Si vous préférez éviter les méthodes en chaîne, les calculs ou même la création de variables supplémentaires, mktime prend en charge la soustraction et les valeurs négatives. valeurs de la manière suivante:

// 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

En ligne PHP éditeur

13
Armfoot

Vous ne savez pas pourquoi votre code actuel ne fonctionne pas, mais si vous n'avez pas spécifiquement besoin d'un objet de date, cela fonctionnera:

$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);
12
Clive

Answear tiré des commentaires de la fonction strtotime manuelle de PHP:

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

Ou

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

Que diriez-vous de ceci: convertissez-le d'abord en timestamp unix, soustrayez 60 * 60 * 24 (exactement un jour en secondes), puis saisissez la date.

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

Remarque: comme l’a rappelé Apokryfos, cette modification serait techniquement retardée par des changements d’heure avancée dans lesquels il y aurait une journée avec 25 ou 23 heures.

3
user3413723

Aussi simple que ça:

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

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

0
Militaru