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ą?

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.


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

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


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.


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.


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

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;

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

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

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

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;

0

jednowierszowy format daty i godziny mysql

$mysql_date_time = (new DateTime())->modify('+15 minutes')->format("Y-m-d H:i:s");

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

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