Adicionando minutos para data e hora em PHP

95

Estou realmente preso em adicionar X minutos a uma data e hora, depois de fazer muita pesquisa no Google e ler manuais de PHP, não estou chegando a lugar nenhum.

O formato de data e hora que tenho é:

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

Os minutos para adicionar serão apenas um número entre 0 e 59

Gostaria que a saída fosse igual ao formato de entrada com os minutos adicionados.

Alguém poderia me dar um exemplo de código funcional, já que minhas tentativas não parecem estar me levando a lugar nenhum?

Luke B
fonte

Respostas:

176
$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');

O padrão ISO 8601 para duração é uma string na forma de P{y}Y{m1}M{d}DT{h}H{m2}M{s}Sonde as {*}partes são substituídas por um valor numérico que indica a duração da duração.

Por exemplo, P1Y2DT5Ssignifica 1 ano, 2 dias e 5 segundos.

No exemplo acima, estamos fornecendo PT5M(ou 5 minutos) para o DateIntervalconstrutor.

Tim Cooper
fonte
Com data: 2011-11-18 00:00 se eu adicionar 5 minutos, obtenho 2012-04-18 00:00 como resultado. `$ time = new DateTime ($ _ REQUEST ['start']); $ time-> add (new DateInterval ('P'. $ duration. 'M')); $ endTime = $ time-> format ('Ymd H: i'); echo $ endTime; `Aplica-se à formatação, parece que também não consigo resolver isso hoje ^ _ ^
Lucas B
2
Como DateTime é melhor do que strtotime?
bozdoz
11
O que 'PT' representa?
NicholasJohn16
1
@bozdoz Não é uma questão de qual método é "melhor". strtotimeproduz um timestamp Unix como um integerque é útil se você estiver, por exemplo, classificando datas em php. A DateTimeclasse fornece opções para operações de estilo de objeto e procedural. É mais legível e também tem melhor suporte para lidar com diferenças entre fusos horários diferentes; por exemplo, se você tiver um projeto que gera datas para vários fusos horários diferentes originados da mesma instância de dados.
DrewT de
1
@ NicholasJohn16 php.net/manual/en/dateinterval.construct.php >> O formato começa com a letra P, para "ponto final". Cada período de duração é representado por um valor inteiro seguido por um designador de período. Se a duração contiver elementos de tempo, essa parte da especificação será precedida pela letra T.
vee
110

A classe DateTime do PHP possui um método de modificação útil que aceita um texto fácil de entender.

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

Você também pode usar interpolação ou concatenação de string para parametrizá-la:

$dateTime = new DateTime('2011-11-17 05:05');
$minutesToAdd = 5;
$dateTime->modify("+{$minutesToAdd} minutes");
Daniel
fonte
10
Mais curto e mais bonito!
1
As duas respostas principais são ótimas e funcionam bem, mas eu prefiro essa. Parece mais simples e intuitivo.
HartleySan
38
$newtimestamp = strtotime('2011-11-17 05:05 + 16 minute');
echo date('Y-m-d H:i:s', $newtimestamp);

resultado é

2011-11-17 05:21:00

Demonstração ao vivo é here

Se você ainda não está familiarizado com ele strtotime, é melhor php.netdescobrir seu grande poder :-)

Nemoden
fonte
1
Mais compreensivo
Naveen DA
19

Você pode fazer isso com funções nativas facilmente:

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

Eu recomendaria o método da classe DateTime, postado recentemente por Tim.

Brad
fonte
7

Achei que isso ajudaria a lidar com fusos horários também. Minha solução modificada é baseada na solução do @Tim Cooper, a resposta correta acima.

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

A linha em negrito, linha 3, é a adição. Espero que isso ajude algumas pessoas também.

acarito
fonte
4

Uma resposta um pouco tardia, mas o método que usaria é:

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

Ou em 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')
Peter
fonte
3

Se você quiser fornecer uma variável que contenha os minutos.

Então eu acho que essa é uma ótima maneira de conseguir isso.

$minutes = 10;
$maxAge = new DateTime('2011-11-17 05:05');
$maxAge->modify("+{$minutes} minutes");
Beaudinn Greve
fonte
2

Usar strtotime("+5 minute", $date);


Exemplo:

$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
fonte
2

Não sei por que a abordagem definida como solução não funcionou para mim. Então estou postando aqui o que funcionou para mim na esperança de que possa ajudar alguém:

$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
fonte
1

Conforme observado por Brad e Nemoden em suas respostas acima, strtotime () é uma ótima função. Pessoalmente, achei o objeto DateTime padrão excessivamente complicado para muitos casos de uso. Eu só queria adicionar 5 minutos ao horário atual, por exemplo.

Escrevi uma função que retorna uma data como string com alguns parâmetros opcionais:
1.) time: String | ex: "+5 minutos" (padrão = hora atual)
2.) formato: String | ex: "Ymd H: i: s" (padrão = "Ymd H: i: s O")

Obviamente, este não é um método completo. Apenas uma função rápida e simples para modificar / formatar a data atual.

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
fonte
0

Mais um exemplo de função para fazer isso: (alterando os formatos de tempo e intervalo da maneira que quiser, de acordo com isso para function.date e isso para DateInterval ):

(Também escrevi uma forma alternativa da função abaixo .)

// 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
fonte
0

formato de data e hora mysql de uma linha

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

Sem usar uma variável:

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

Com o uso de uma variável:

 $interval= 15;
 $yourDate->modify("+{$interval } minutes");  
 echo $yourDate->format( "Y-m-d H:i");
Wajid Khan
fonte
O que é $yourDate? O que essa resposta adiciona às respostas semelhantes postadas anos antes?
Nenhum
Caro @ J.Money, $ yourDate significa $ nome da variável e Talvez minha resposta seja útil para alguém após 100 anos. Não importa quando devemos responder até que a pergunta não seja encerrada. Espero que você compreenda e remova a marcação negativa.
Wajid khan