Odejmij 1 dzień z PHP


83

Próbuję pobrać obiekt daty, który wychodzi z mojego CMS Drupala, odjąć jeden dzień i wydrukować obie daty. Oto co mam

$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

Więc nie rozumiem, dlaczego oryginalny obiekt daty wychodzi dobrze, ale potem próbuję utworzyć dodatkowy obiekt daty i zmodyfikować go, odejmując jeden dzień, i wygląda na to, że nie mogę tego zrobić. Wydruk jest zawsze pusty.

Odpowiedzi:


147

Możesz spróbować:

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

1
Możesz uzyskać ten sam format $ date_raw z$date_raw = date("r");
sHaDeoNeR

5
Bądź ostrożny! Jeśli obsługujesz daty po 2038 r ., Nie zadziała z powodu ograniczenia rozmiaru liczb całkowitych w PHP (przynajmniej na platformie 32-bitowej). W takim przypadku najbezpieczniejszym rozwiązaniem jest użycie DateTime( patrz tutaj ).
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");

Korzystanie z DateTime znacznie zmniejszyło liczbę bólów głowy podczas manipulowania datami.


6
date_createjest proceduralną metodą wywoływania DateTimekonstruktora , która pozwala zredukować 3 wiersze do 1 bez użycia new. Tj.echo date_create('2017-05-18')->modify('-1 day')->format('Y-m-d H:i:s');
Armfoot

cóż, kod z oryginalnego adresu można również zapisać w 1 linii, na przykład:(new \DateTime("2017-05-18"))->modify("-1 day")->format("Y-m-d H:i:s")
Scofield

22

Wersja zorientowana obiektowo

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

Twoja odpowiedź dodaje jeden dzień zamiast go odejmować. Poza tym byłoby to moje preferowane rozwiązanie.
Burki

18

Jedna wkładka rozwiązaniem jest:

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

Uruchomienie go w edytorze PHP online .


mktime alternatywa

Jeśli wolisz unikać stosowania metod łańcuchowych, wykonywania obliczeń, a nawet tworzenia dodatkowych zmiennych, mktime obsługuje odejmowanie i wartości ujemne w następujący sposób:

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

Edytor PHP online


13

Nie jestem pewien, dlaczego twój obecny kod nie działa, ale jeśli nie potrzebujesz specjalnie obiektu daty, zadziała:

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

Dzięki Clive! Ten zadziałał dla mnie ... tak, tak naprawdę nie potrzebowałem obiektów daty, po prostu potrzebowałem wydrukować sformatowane daty.
td-dev

7

Answear zaczerpnięte z ręcznej funkcji strtotime w PHP komentarze:

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

Lub

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

4

Takie proste:

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

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


3

Co powiesz na to: najpierw przekonwertuj go na sygnaturę czasową unixa, odejmij 60 * 60 * 24 (dokładnie jeden dzień w sekundach), a następnie pobierz z tego datę.

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

Uwaga: jak wskazał apokryfos, technicznie rzecz biorąc, byłoby to odrzucone przez zmiany czasu letniego, w których byłby dzień z 25 lub 23 godzinami


Dobry, tylko ja zrobiłem to tak: $ newDate = date_create ($ date_raw) -> getTimestamp () - 60 * 60 * 24;
Yevgeniy Afanasjew

Zakłada się, że wszystkie dni trwają 24 godziny, co nie jest prawdą w tych 2 dniach, kiedy mniejszość świata przesuwa swoje zegary o +/- 1 godzinę, aby stworzyć iluzję mniej lub bardziej światła słonecznego. Są też sekundy przestępne.
apokryfos

to świetny chwyt @apokryfos. Nie użyłbym tego do super naukowych obliczeń, ale w większości przypadków powinno być dobrze.
user3413723

-1

Jak dodać 1 rok do daty, a następnie odjąć 1 dzień od niej w asp.net C #

Convert.ToDateTime(txtDate.Value.Trim()).AddYears(1).AddDays(-1);

To nie jest PHP.
atheaos
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.