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.
Tu peux essayer:
print('Next Date ' . date('Y-m-d', strtotime('-1 day', strtotime($date_raw))));
date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
$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.
Version orientée objet
$dateObject = new DateTime( $date_raw );
print('Next Date ' . $dateObject->sub( new DateInterval('P1D') )->format('Y-m-d');
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 .
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
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);
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"));
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.
Aussi simple que ça:
date("Y-m-d", strtotime("-1 day"));
date("Y-m-d", strtotime("-1 months"))