adicionando 1 dia a um valor de formato DATETIME

87

Em certas situações, desejo adicionar 1 dia ao valor da minha variável formatada DATETIME:

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

Qual é a melhor maneira de fazer isso?

ian
fonte

Respostas:

63

Se você quiser fazer isso em 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));

Se você deseja adicionar a data no MySQL:

-- replace CURRENT_DATE with the date you want to add one day to
SELECT DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY);
RaYell
fonte
isso não vai me dar a hora atual? eu ainda preciso manter meu tempo inserido pelo usuário.
ian de
Sim, mas eu marquei quais valores você deve alterar para o horário personalizado. Você pode simplesmente substituir time()por strtotime("{$_GET['start_hours']}:{$_GET['start_minutes']} {$_GET['start_ampm']}").
RaYell de
isso não é verão / inverno salvar! Use a manipulação de data / hora para salvar DST
steven
208

Há mais de uma maneira de fazer isso com DateTime, que foi introduzido no PHP 5.2. Ao contrário do uso, strtotime()isso levará em conta o horário de verão e o ano bissexto.

$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
fonte
Ah, um loop da loop .
Funk Forty Niner
9
Se adicionar mais de um dia, você pode usar plural ou singular e obter o mesmo resultado, por exemplo: +2 dayou +2 days(obviamente +2 daysé semanticamente mais correto)
timhc22
Quais são as diferenças práticas entre esses métodos? O primeiro exemplo parece o mais simples e semântico para mim.
BadHorsie
24

O construtor DateTime aceita um parâmetro string time. $timepode ser coisas diferentes, tem que respeitar o formato datetime .

Existem alguns valores válidos como exemplos:

  • 'now' (o valor padrão)
  • 2017-10-19
  • 2017-10-19 11:59:59
  • 2017-10-19 +1day

Portanto, no seu caso, você pode usar o seguinte.

$dt = new \DateTime('now +1 day'); //Tomorrow
$dt = new \DateTime('2016-01-01 +1 day'); //2016-01-02
Dmitry
fonte
3
Respondendo sem explicação? Leia Como escrevo uma boa resposta?
Shashanth de
10
  1. Use strtotimepara converter a string em um carimbo de hora
  2. Adicione um dia a ele (por exemplo: adicionando 86400 segundos (24 * 60 * 60))

por exemplo:

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

Se for apenas adicionar 1 dia, usar strtotime novamente é provavelmente um exagero.

nickf
fonte
Então eu preciso convertê-lo para um TIMESTAMP e depois voltar para o formato DATETIME?
ian
4
Acho que também deve ser observado que nem todo dia dura 24 horas. Na maioria dos lugares do mundo, o horário de verão (horário de verão) significa que um dia por ano tem apenas 23 horas e outro dia 25 horas.
nickf
Ups. Você converte uma data e hora em um carimbo de data / hora, portanto, é baseado em UTC. E os dias UTC têm sempre 24h. Ao converter de volta para date()o fuso horário local, é levado em consideração que cuidará do horário de verão.
rabudde
5

Você pode usar

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

Eu sugiro começar a usar as classes Zend_Date do Zend Framework . Eu sei, é um pouco offtopic, mas vou gostar assim :-)

$date = new Zend_Date();
$date->add('24:00:00', Zend_Date::TIMES);
print $date->get();
Pawka
fonte
você pode ver meu relacionado (quesiton) [ stackoverflow.com/q/61421783/8919244] ?
Moeez,
1

Você pode usar o seguinte.

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

Você também pode definir os dias como constantes e usar como abaixo.

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

Usando o tempo de solicitação do servidor para adicionar dias. Trabalhando conforme o esperado.

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

Aqui, '+2 dias' para adicionar qualquer número de dias.

Niroshan
fonte
0

Existe uma maneira mais concisa e intuitiva de adicionar dias à data do php. Não me entenda mal, essas expressões php são ótimas, mas você sempre tem que pesquisar no Google como tratá-las. Sinto falta da facilidade de preenchimento automático para isso.

Aqui está como eu gosto de lidar com esses casos:

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

Para mim, é muito mais intuitivo e o preenchimento automático funciona fora da caixa. Não há necessidade de procurar a solução no Google todas as vezes.

Como um bom bônus, você não precisa se preocupar em formatar o valor resultante, ele já está no formato ISO8601.

Esta é a biblioteca de merengue, há mais exemplos aqui .

Vadim Samokhin
fonte