dodanie 1 dnia do wartości formatu DATETIME

89

W niektórych sytuacjach chcę dodać 1 dzień do wartości mojej zmiennej w formacie DATETIME:

$start_date = date('Y-m-d H:i:s', strtotime("{$_GET['start_hours']}:{$_GET['start_minutes']} {$_GET['start_ampm']}"));

Jaki jest najlepszy sposób, aby to zrobić?

Jan
źródło

Odpowiedzi:

64

Jeśli chcesz to zrobić w PHP:

// replace time() with the time stamp you want to add one day to
$startDate = time();
date('Y-m-d H:i:s', strtotime('+1 day', $startDate));

Jeśli chcesz dodać datę w MySQL:

-- replace CURRENT_DATE with the date you want to add one day to
SELECT DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY);
RaYell
źródło
czy to nie da mi aktualnego czasu? nadal muszę zachować czas wprowadzony przez użytkownika.
Ian
Tak, ale zaznaczyłem, jakie wartości należy zmienić na niestandardowy czas. Można po prostu zastąpić time()z strtotime("{$_GET['start_hours']}:{$_GET['start_minutes']} {$_GET['start_ampm']}").
RaYell
to nie jest ochrona na lato / zimę! Proszę użyć zmiany daty / czasu DST
Steven
212

Jest więcej niż jeden sposób, aby to zrobić za pomocą DateTime, który został wprowadzony w PHP 5.2. W przeciwieństwie do korzystania z strtotime()tego, uwzględni się czas letni i rok przestępny.

$datetime = new DateTime('2013-01-29');
$datetime->modify('+1 day');
echo $datetime->format('Y-m-d H:i:s');

// Available in PHP 5.3

$datetime = new DateTime('2013-01-29');
$datetime->add(new DateInterval('P1D'));
echo $datetime->format('Y-m-d H:i:s');

// Available in PHP 5.4

echo (new DateTime('2013-01-29'))->add(new DateInterval('P1D'))->format('Y-m-d H:i:s');

// Available in PHP 5.5

$start = new DateTimeImmutable('2013-01-29');
$datetime = $start->modify('+1 day');
echo $datetime->format('Y-m-d H:i:s');
John Conde
źródło
Ach, pętla da pętla .
Funk Forty Niner
9
Jeśli dodajesz więcej niż jeden dzień, możesz użyć liczby mnogiej lub pojedynczej i uzyskać ten sam wynik, np .: +2 daylub +2 days(oczywiście +2 daysjest bardziej poprawne semantycznie)
timhc22
1
Jakie są praktyczne różnice między tymi metodami? Pierwszy przykład wydaje mi się najprostszy i najbardziej semantyczny.
BadHorsie
24

Konstruktor DateTime przyjmuje parametr string time. $timemogą być różne rzeczy, musi przestrzegać formatu daty i godziny .

Oto kilka prawidłowych wartości jako przykłady:

  • 'now' (wartość domyślna)
  • 2017-10-19
  • 2017-10-19 11:59:59
  • 2017-10-19 +1day

Tak więc w twoim przypadku możesz użyć następującego.

$dt = new \DateTime('now +1 day'); //Tomorrow
$dt = new \DateTime('2016-01-01 +1 day'); //2016-01-02
Dmitry
źródło
3
Odpowiadasz bez wyjaśnienia? Przeczytaj Jak napisać dobrą odpowiedź?
Shashanth
11
  1. Służy strtotimedo konwersji ciągu na znacznik czasu
  2. Dodaj do niego dzień (np .: dodając 86400 sekund (24 * 60 * 60))

na przykład:

$time = strtotime($myInput);
$newTime = $time + 86400;

Jeśli jest to tylko dodanie 1 dnia, ponowne użycie strtotime jest prawdopodobnie przesadą.

nickf
źródło
Więc muszę przekonwertować go na TIMESTAMP, a następnie z powrotem na format DATETIME?
Ian
4
Chyba trzeba też zauważyć, że nie każdy dzień trwa 24 godziny. W większości miejsc na świecie czas letni (czas letni) oznacza, że ​​jeden dzień w roku to tylko 23 godziny, a drugi 25 godzin.
nickf
UPS. Konwertujesz datę i godzinę na znacznik czasu, więc jest oparty na UTC. A dni UTC mają zawsze 24 godziny . Podczas konwersji z powrotem z date()lokalną strefą czasową brana jest pod uwagę, która zajmie się czasem letnim.
rabudde
5

Możesz użyć

$now = new DateTime();
$date = $now->modify('+1 day')->format('Y-m-d H:i:s');
Omar
źródło
1

Proponuję zacząć używać klas Zend_Date z Zend Framework . Wiem, trochę offtopic, ale podoba mi się ten sposób :-)

$date = new Zend_Date();
$date->add('24:00:00', Zend_Date::TIMES);
print $date->get();
Pawka
źródło
czy możesz zobaczyć moje powiązane (quesiton) [ stackoverflow.com/q/61421783/8919244] ?
Moeez
1

Możesz użyć w następujący sposób.

$start_date = date('Y-m-d H:i:s');
$end_date = date("Y-m-d 23:59:59", strtotime('+3 days', strtotime($start_date)));

Możesz również ustawić dni jako stałe i używać jak poniżej.

if (!defined('ADD_DAYS')) define('ADD_DAYS','+3 days');
$end_date = date("Y-m-d 23:59:59", strtotime(ADD_DAYS, strtotime($start_date)));
user3216114
źródło
0

Korzystanie z czasu żądania serwera, aby dodać dni. Działa zgodnie z oczekiwaniami.

25/08/19 => 27/09/19

$timestamp = $_SERVER['REQUEST_TIME'];
$dateNow = date('d/m/y', $timestamp);
$newDate = date('d/m/y', strtotime('+2 day', $timestamp));

Tutaj „+2 dni”, aby dodać dowolną liczbę dni.

Niroshan
źródło
0

Istnieje bardziej zwięzły i intuicyjny sposób dodawania dni do daty php. Nie zrozum mnie źle, te wyrażenia php są świetne, ale zawsze musisz wygooglować, jak je traktować. Brakuje mi za to funkcji automatycznego uzupełniania.

Oto, jak lubię radzić sobie z takimi przypadkami:

(new Future(
    new DateTimeFromISO8601String('2014-11-21T06:04:31.321987+00:00'),
    new OneDay()
))
    ->value();

Dla mnie jest to o wiele bardziej intuicyjne, a autouzupełnianie działa od razu po wyjęciu z pudełka. Nie musisz za każdym razem wyszukiwać w Google rozwiązania.

Jako miły bonus, nie musisz się martwić formatowaniem wynikowej wartości, jest to już format ISO8601.

Jest to biblioteka beza, istnieje więcej przykładów tutaj .

Vadim Samokhin
źródło