Dodawanie minut do daty w PHP

99

Naprawdę utknąłem z dodawaniem X minut do daty i godziny, po wielu przeglądaniu google i ręcznym czytaniu PHP, wydaje się, że nic nie osiągam.

Mam następujący format daty i czasu:

2011-11-17 05:05: year-month-day hour:minute

Minuty do dodania to po prostu liczba od 0 do 59

Chciałbym, aby wynik był taki sam jak format wejściowy z dodanymi minutami.

Czy ktoś mógłby mi podać działający przykład kodu, ponieważ moje próby nigdzie mnie nie prowadzą?

Łukasz B.
źródło

Odpowiedzi:

178
$minutes_to_add = 5;

$time = new DateTime('2011-11-17 05:05');
$time->add(new DateInterval('PT' . $minutes_to_add . 'M'));

$stamp = $time->format('Y-m-d H:i');

Norma ISO 8601 dla trwania jest ciągiem w formie P{y}Y{m1}M{d}DT{h}H{m2}M{s}S, gdzie {*}części są zamieniane na wartości liczba wskazująca, jak długo jest czas.

Na przykład P1Y2DT5Soznacza 1 rok, 2 dni i 5 sekund.

W powyższym przykładzie zapewniamy PT5M(lub 5 minut) DateIntervalkonstruktorowi.

Tim Cooper
źródło
Z datą: 2011-11-18 00:00 jeśli dodam 5 minut, w rezultacie otrzymam 2012-04-18 00:00. `$ czas = nowy DateTime ($ _ REQUEST ['start']); $ time-> add (new DateInterval ('P'. $ duration. 'M')); $ endTime = $ czas-> format ('Ymd H: i'); echo $ endTime; `Stosując się do formatowania, wygląda na to, że nie mogę tego rozwiązać dzisiaj ^ _ ^
Luke B
2
W jaki sposób DateTime jest lepszy niż strtotime?
bozdoz
11
Co oznacza „PT”?
NicholasJohn
1
@bozdoz Nie chodzi o to, która metoda jest „lepsza”. strtotimetworzy uniksowy znacznik czasu, integerktóry jest przydatny, jeśli na przykład sortujesz daty w php. DateTimeKlasa udostępnia opcje dla operacji typu obiektów i proceduralnym. Jest bardziej czytelny i lepiej obsługuje różnice między różnymi strefami czasowymi; na przykład, jeśli masz projekt, który generuje daty dla wielu różnych stref czasowych pochodzących z tej samej instancji danych.
DrewT
2
@ NicholasJohn16 php.net/manual/en/dateinterval.construct.php >> Format zaczyna się na literę P, oznaczającą „kropkę”. Każdy okres trwania jest reprezentowany przez wartość całkowitą, po której następuje oznaczenie okresu. Jeśli czas trwania zawiera elementy czasu, ta część specyfikacji jest poprzedzona literą T.
vee
115

Klasa DateTime w PHP zawiera przydatną metodę modyfikacji , która pobiera łatwy do zrozumienia tekst.

$dateTime = new DateTime('2011-11-17 05:05');
$dateTime->modify('+5 minutes');

Możesz również użyć interpolacji lub konkatenacji ciągów do sparametryzowania:

$dateTime = new DateTime('2011-11-17 05:05');
$minutesToAdd = 5;
$dateTime->modify("+{$minutesToAdd} minutes");
Daniel
źródło
10
Najkrótsza i najładniejsza!
1
Obie najpopularniejsze odpowiedzi są świetne i działają dobrze, ale wolę tę. Po prostu wydaje się prostsze i bardziej intuicyjne.
HartleySan
38
$newtimestamp = strtotime('2011-11-17 05:05 + 16 minute');
echo date('Y-m-d H:i:s', $newtimestamp);

wynik jest

17.11.2011 05:21:00

Demo na żywo jest here

Jeśli jeszcze go nie znasz strtotime, lepiej udaj się, php.netaby odkryć jego wielką moc :-)

Nemoden
źródło
1
Najbardziej zrozumiały
Naveen DA,
19

Możesz to łatwo zrobić za pomocą natywnych funkcji:

strtotime('+59 minutes', strtotime('2011-11-17 05:05'));

Poleciłbym jednak metodę klasy DateTime, opublikowaną właśnie przez Tima.

Ćwiek
źródło
7

Pomyślałem, że to pomoże niektórym, jeśli chodzi o strefy czasowe. Moje zmodyfikowane rozwiązanie jest oparte na rozwiązaniu @Tim Coopera, poprawna odpowiedź powyżej.

$minutes_to_add = 10;
$time = new DateTime();
**$time->setTimezone(new DateTimeZone('America/Toronto'));**
$time->add(new DateInterval('PT' . $minutes_to_add . 'M'));
$timestamp = $time->format("Y/m/d G:i:s");

Pogrubiona linia, linia 3, to dodatek. Mam nadzieję, że to pomoże również niektórym ludziom.

acarito
źródło
4

Trochę późna odpowiedź, ale metoda, której użyłbym, to:

// Create a new \DateTime instance
$date = DateTime::createFromFormat('Y-m-d H:i:s', '2015-10-26 10:00:00');

// Modify the date
$date->modify('+5 minutes');

// Output
echo $date->format('Y-m-d H:i:s');

Lub w PHP> = 5.4

echo (DateTime::createFromFormat('Y-m-d H:i:s', '2015-10-26 10:00:00'))->modify('+5 minutes')->format('Y-m-d H:i:s')
Piotr
źródło
4

Nie wiem, dlaczego podejście ustawione jako rozwiązanie nie zadziałało dla mnie. Dlatego publikuję tutaj, co zadziałało dla mnie, mając nadzieję, że może pomóc każdemu:

$startTime = date("Y-m-d H:i:s");

//display the starting time
echo '> '.$startTime . "<br>";

//adding 2 minutes
$convertedTime = date('Y-m-d H:i:s', strtotime('+2 minutes', strtotime($startTime)));

//display the converted time
echo '> '.$convertedTime;
user3361395
źródło
3

Jeśli chcesz podać zmienną zawierającą minuty.

Myślę więc, że to świetny sposób na osiągnięcie tego.

$minutes = 10;
$maxAge = new DateTime('2011-11-17 05:05');
$maxAge->modify("+{$minutes} minutes");
Beaudinn Greve
źródło
2

Posługiwać się strtotime("+5 minute", $date);


Przykład:

$date = "2017-06-16 08:40:00";
$date = strtotime($date);
$date = strtotime("+5 minute", $date);
echo date('Y-m-d H:i:s', $date);
DeathRs
źródło
1

Jak zauważyli Brad i Nemoden w swoich odpowiedziach powyżej, strtotime () to świetna funkcja. Osobiście uważam, że standardowy obiekt DateTime jest zbyt skomplikowany w wielu przypadkach użycia. Chciałem tylko dodać 5 minut do aktualnego czasu.

Napisałem funkcję, która zwraca datę jako ciąg z kilkoma opcjonalnymi parametrami:
1.) time: String | np .: „+5 minut” (domyślnie = aktualny czas)
2.) format: String | np .: „Ymd H: i: s” (domyślnie = „Ymd H: i: s O”)

Oczywiście nie jest to w pełni funkcjonalna metoda. Po prostu szybka i prosta funkcja do modyfikacji / formatowania aktualnej daty.

function get_date($time=null, $format='Y-m-d H:i:s O')
{
    if(empty($time))return date($format);
    return date($format, strtotime($time));
}

// Example #1: Return current date in default format
$date = get_date(); 

// Example #2: Add 5 minutes to the current date
$date = get_date("+5 minutes"); 

// Example #3: Subtract 30 days from the current date & format as 'Y-m-d H:i:s'
$date = get_date("-30 days", "Y-m-d H:i:s"); 
Robert Schwindaman
źródło
0

Jeszcze jeden przykład funkcji, która to robi: (zmiana formatów czasu i interwałów w dowolny sposób, zgodnie z tym dla funkcji function.date i dla DateInterval ):

(Napisałem również alternatywną formę poniższej funkcji ).

// Return adjusted time.

function addMinutesToTime( $dateTime, $plusMinutes ) {

    $dateTime = DateTime::createFromFormat( 'Y-m-d H:i', $dateTime );
    $dateTime->add( new DateInterval( 'PT' . ( (integer) $plusMinutes ) . 'M' ) );
    $newTime = $dateTime->format( 'Y-m-d H:i' );

    return $newTime;
}

$adjustedTime = addMinutesToTime( '2011-11-17 05:05', 59 );

echo '<h1>Adjusted Time: ' . $adjustedTime . '</h1>' . PHP_EOL . PHP_EOL;
FirstFraktal
źródło
0

jednowierszowy format daty i godziny mysql

$mysql_date_time = (new DateTime())->modify('+15 minutes')->format("Y-m-d H:i:s");
Sjaak Wish
źródło
-1

Bez użycia zmiennej:

 $yourDate->modify("15 minutes");
 echo $yourDate->format( "Y-m-d H:i");

Przy użyciu zmiennej:

 $interval= 15;
 $yourDate->modify("+{$interval } minutes");  
 echo $yourDate->format( "Y-m-d H:i");
Wajid khan
źródło
Co to jest $yourDate? Co ta odpowiedź dodaje do podobnych odpowiedzi opublikowanych lata wcześniej?
Brak
Drogi @ J.Money $ yourDate oznacza $ nazwa zmiennej i Może moja odpowiedź będzie pomocna komuś po 100 latach. Nie ma znaczenia, kiedy powinniśmy odpowiedzieć, dopóki pytanie nie zostanie zamknięte. Mam nadzieję, że zrozumiesz i usuniesz oznaczenia negatywne.
Wajid khan