php - добавить два часа до переменной даты

Я хочу добавить 3 минуты к имеющейся у меня переменной даты / времени, но не знаю, как это сделать. Я сделал переменную из такой строки: (в формате даты RFC 2822, кстати)

$date = 2011-10-18T19:56:00+0200

Я преобразовал эту строку в дату с помощью этой команды:

$time = date_format(DateTime::createFromFormat("Y-m-d\TH:i:sO", $date), "G:i")

Теперь я хотел бы добавить к этой переменной 3 минуты, но я не уверен, как это сделать. Раньше я использовал следующую команду в своем скрипте, но это применимо к текущей дате / времени, поэтому я не уверен, как использовать это для моей переменной времени:

$currenttime = date('G:i', strtotime('+2 hours'));

Итак, как я могу добавить три минуты к переменной $ time?


person laarsk    schedule 18.10.2011    source источник


Ответы (3)


Используйте второй параметр strtotime, чтобы указать справочное время:

$date_rfc2822 = '2011-10-18T19:56:00+0200';
$dateTime = DateTime::createFromFormat("Y-m-d\TH:i:sO", $date_rfc2822);
echo date('G:i', strtotime('+2 hours', $dateTime->getTimestamp()));
person phihag    schedule 18.10.2011
comment
Это не делает то, что я хочу, я только что понял, поскольку он берет текущее время и добавляет 3 минуты, он не получает свое время из переменной $ datetime ... я прав? - person laarsk; 18.10.2011
comment
@laarks Нет, текущее время нигде не используется. Обратите внимание, что эта точная демонстрационная программа (с префиксом <?php) всегда выводит 21:56, независимо от того, сколько сейчас времени. - person phihag; 19.10.2011
comment
Хммм, тогда я думаю, ты прав. Но у меня уже есть другое исправление: я дважды использовал strtotime :), который также отлично получает дату [from: stackoverflow.com/questions/7812112/ - person laarsk; 19.10.2011

Поскольку вы уже используете объект DateTime, придерживайтесь его:

$time = DateTime::createFromFormat("Y-m-d\TH:i:sO", $date);
$three_minutes = $time->add(new DateInterval('P2H'));
                                               ^^--two (2) hours (H)
person Marc B    schedule 18.10.2011
comment
Еще лучшее решение, так как я не хочу изменять текущее время, большое спасибо! - person laarsk; 18.10.2011
comment
К сожалению, я не могу заставить его работать ...: S Я получил это сейчас вот так: echo 'Arrival: '.date_format($time, 'G:i').'<br \>'."\n"; echo 'Departure: '; echo ( $time->add(new DateInterval('P2H')) ); echo '<br \><br \>'."\n"; но страница останавливается на эхе отъезда ... - person laarsk; 18.10.2011
comment
формат строки неверен. Вам нужно использовать $ time- ›add (new DateInterval ('PT2H')); - person Marcos Bergamo; 15.05.2014

Формат начинается с буквы P, что означает «точка». Каждый период продолжительности представлен целым числом, за которым следует указатель периода. Если продолжительность содержит элементы времени, этой части спецификации предшествует буква T.

http://www.php.net/manual/en/dateinterval.construct.php

При этом мое решение аналогичной проблемы таково:

// pretend that $date is what you got from mysql
// which is like 2013-02-12 23:08:17
echo "<br>";
echo $date;
$time = DateTime::createFromFormat("Y-m-d H:i:s", $date);
echo "<br>";
echo $time->format('H-i-s');
$time->add(new DateInterval('PT2H'));
echo "<br>";
echo $time->format('H-i-s');
// Outputs:
// 2013-02-12 23:08:17
// 23-08-17
// 01-08-17

Дело в том, чтобы добавить P при использовании класса DateInterval и T перед записями времени. В вашем случае вам нужно использовать PT3M для 3-минутного добавления. Я пытался добавить 2 часа, и то, что я сделал, было $time->add(new DateInterval('PT2H'));.

Если вы посмотрите на спецификации интервалов:

Y   years
M   months
D   days
W   weeks. These get converted into days, so can not be combined with D.
H   hours
M   minutes
S   seconds

M для months и M для minutes. Вот почему T впереди времени.

По крайней мере, в это хочется верить ... 'О_О

person Logan    schedule 13.02.2013