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.
php
datetimeoffset
td-dev
źródło
źródło
$date_raw = date("r");
DateTime
( patrz tutaj ).date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
źródło
$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.
źródło
date_create
jest proceduralną metodą wywoływaniaDateTime
konstruktora , która pozwala zredukować 3 wiersze do 1 bez użycianew
. Tj.echo date_create('2017-05-18')->modify('-1 day')->format('Y-m-d H:i:s');
(new \DateTime("2017-05-18"))->modify("-1 day")->format("Y-m-d H:i:s")
Wersja zorientowana obiektowo
$dateObject = new DateTime( $date_raw ); print('Next Date ' . $dateObject->sub( new DateInterval('P1D') )->format('Y-m-d');
źródło
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
źródło
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);
źródło
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"));
źródło
Takie proste:
date("Y-m-d", strtotime("-1 day"));
date("Y-m-d", strtotime("-1 months"))
źródło
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
źródło
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);
źródło