1 Tag mit PHP abziehen

80

Ich versuche, ein Datumsobjekt zu nehmen, das aus meinem Drupal-CMS stammt, einen Tag zu subtrahieren und beide Daten auszudrucken. Hier ist was ich habe

$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

Ich verstehe also nicht, warum das ursprüngliche Datumsobjekt gut herauskommt, aber dann versuche ich, ein zusätzliches Datumsobjekt zu erstellen und es durch Subtrahieren eines Tages zu ändern, und es scheint, dass ich das nicht tun kann. Die Ausgabe ist immer leer.

td-dev
quelle

Antworten:

145

Du kannst es versuchen:

print('Next Date ' . date('Y-m-d', strtotime('-1 day', strtotime($date_raw))));
MasterCassim
quelle
1
Sie können das gleiche Format $ date_raw mit$date_raw = date("r");
sHaDeoNeR
4
Achtung! Wenn Sie Daten nach 2038 verarbeiten , funktioniert dies aufgrund der Beschränkung der Ganzzahlgröße in PHP (zumindest auf einer 32-Bit-Plattform) nicht. In diesem Fall ist die sicherste Lösung die Verwendung DateTime( siehe hier ).
Tip-Sy
60
 date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
Ich denke
quelle
31
$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");

Durch die Verwendung von DateTime konnten die Kopfschmerzen beim Bearbeiten von Datumsangaben erheblich reduziert werden.

aberdat
quelle
6
date_createist die prozedurale Methode zum Aufrufen des DateTimeKonstruktors , mit der Sie Ihre 3 Zeilen ohne Verwendung auf 1 reduzieren können new. Ieecho date_create('2017-05-18')->modify('-1 day')->format('Y-m-d H:i:s');
Armfoot
22

Objektorientierte Version

$dateObject = new DateTime( $date_raw );
print('Next Date ' . $dateObject->sub( new DateInterval('P1D') )->format('Y-m-d');
Cosmitar
quelle
Ihre Antwort fügt einen Tag hinzu, anstatt sie zu subtrahieren. Davon abgesehen wäre es meine bevorzugte Lösung.
Burki
17

Eine Einzeileroption ist:

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

Ausführen im Online PHP Editor .


mktime Alternative

Wenn Sie es vorziehen, keine String-Methoden zu verwenden, Berechnungen durchzuführen oder sogar zusätzliche Variablen zu erstellen, unterstützt mktime die Subtraktion und negative Werte auf folgende Weise:

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

Online PHP Editor

Armfuß
quelle
13

Sie sind sich nicht sicher, warum Ihr aktueller Code nicht funktioniert, aber wenn Sie kein spezielles Datumsobjekt benötigen, funktioniert dies:

$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
quelle
Danke Clive! Das hat bei mir funktioniert ... ja, ich brauchte keine Datumsobjekte, ich musste nur die formatierten Datumsangaben drucken.
td-dev
7

Antworten aus PHP Handbuch strtotime Funktion Kommentare entnommen:

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

Oder

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

Wie wäre es damit: Konvertieren Sie es zuerst in einen Unix-Zeitstempel, subtrahieren Sie 60 * 60 * 24 (genau einen Tag in Sekunden) und ermitteln Sie dann das Datum daraus.

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

Hinweis: Wie Apokryfos hervorgehoben hat, würde dies technisch durch Änderungen der Sommerzeit beeinträchtigt, wenn es einen Tag mit 25 oder 23 Stunden geben würde

user3413723
quelle
Gut, nur ich habe es so gemacht: $ newDate = date_create ($ date_raw) -> getTimestamp () - 60 * 60 * 24;
Jewgenij Afanasjew
Dies setzt voraus, dass alle Tage 24 Stunden lang sind, was in den 2 Tagen nicht der Fall ist, in denen eine Minderheit der Welt ihre Uhren um +/- 1 Stunde bewegt, um eine Illusion von mehr oder weniger Sonnenlicht zu erzeugen. Und dann gibt es noch Schaltsekunden.
Apokryfos
Das ist ein großartiger Fang @apokryfos. Ich würde dies nicht für eine super wissenschaftliche Berechnung verwenden, aber in den allermeisten Fällen sollte es immer noch in Ordnung sein.
user3413723
2

So einfach ist das:

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

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

Militaru
quelle
-1

So fügen Sie einem Datum 1 Jahr hinzu und subtrahieren dann 1 Tag davon in asp.net c #

Convert.ToDateTime(txtDate.Value.Trim()).AddYears(1).AddDays(-1);
Code
quelle
Dies ist kein PHP.
Atheaos