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.

Antworten:


145

Du kannst es versuchen:

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

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

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.


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

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


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

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

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


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


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

Dies ist kein PHP.
Atheaos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.