Adicionando um dia a uma data

172

Meu código para adicionar um dia a uma data retorna uma data antes do dia adicionando: a 2009-09-30 20:24:00data após a adição de um dia DEVE ser rolada para o próximo mês:1970-01-01 17:33:29

<?php

    //add day to date test for month roll over

    $stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00"));

    echo 'date before day adding: '.$stop_date; 

    $stop_date = date('Y-m-d H:i:s', strtotime('+1 day', $stop_date));

    echo ' date after adding one day. SHOULD be rolled over to the next month: '.$stop_date;
?>

Eu usei código bastante semelhante antes, o que estou fazendo de errado aqui?

ian
fonte

Respostas:

333
<?php
$stop_date = '2009-09-30 20:24:00';
echo 'date before day adding: ' . $stop_date; 
$stop_date = date('Y-m-d H:i:s', strtotime($stop_date . ' +1 day'));
echo 'date after adding 1 day: ' . $stop_date;
?>

Para o PHP 5.2.0+, você também pode fazer o seguinte:

$stop_date = new DateTime('2009-09-30 20:24:00');
echo 'date before day adding: ' . $stop_date->format('Y-m-d H:i:s'); 
$stop_date->modify('+1 day');
echo 'date after adding 1 day: ' . $stop_date->format('Y-m-d H:i:s');
w35l3y
fonte
3
Obrigado. Resolvido como: $ stop_date = date ('Ymd H: i: s', strtotime ("$ stop_date + 1 dia"));
8/09/09
11
Você não deve usar uma variável em uma string. Você deve usar: date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));como na resposta que a @ w35l3y deu a você.
Cas Bloem
Você deve adicionar uma chamada à função date_default_timezone_set antes de executar este código. Por exemplo, adicione date_default_timezone_set ('Europe / Rome');
Luca Mastrostefano
96
$date = new DateTime('2000-12-31');

$date->modify('+1 day');
echo $date->format('Y-m-d') . "\n";
Prasanth Bendra
fonte
6
Esta é uma solução perfeita mais recente.
Cas Bloem
... Enquanto ele não causar erros fatais quando executado em seu host;)
Henrik Erlandsson
Não peça desculpas. Algumas pessoas postaram a resposta da dama 3 anos depois que você fez
Mawg diz que restabelece a Monica em
1
Você deve adicionar uma chamada à função date_default_timezone_set antes de executar este código. Por exemplo, adicione date_default_timezone_set ('Europe / Rome');
Luca Mastrostefano
@LucaMastrostefano não, você deve ter o conjunto de fuso horário no seu servidor ...
MH
28

Solução mais simples:

$date = new DateTime('+1 day');
echo $date->format('Y-m-d H:i:s');
minlare
fonte
Eu gosto do seu caminho em um um forroecho (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Aba
@Aba Eu não acho que seu um forro funciona em versões mais antigas do PHP, porque eu tentei e eu tenho um erro:Unexpected T_OBJECT_OPERATOR” error in PHP
Zachary Weixelbaum
25

Funcionou para mim: para a data atual

$date = date('Y-m-d', strtotime("+1 day"));

para qualquer data:

date('Y-m-d', strtotime("+1 day", strtotime($date)));
Jay Momaya
fonte
2
obrigado funcionou para mim. A solução mais simples de todas.
Puneet Verma
2
você não precisa repetir e aninhar strtotime()- ele pode lidar com tudo em uma chamada:date('Y-m-d', strtotime($date . " +1 day"));
billynoah 13/18
2
Bom, esta é a solução mais simples! Obrigado
Angel
7

Tente isto

echo date('Y-m-d H:i:s',date(strtotime("+1 day", strtotime("2009-09-30 20:24:00"))));
user1987095
fonte
Obrigado companheiro. Isso me ajudou.
Vandolph Reyes
6

Simples de ler e entender de maneira:

$original_date = "2009-09-29";

$time_original = strtotime($original_date);
$time_add      = $time_original + (3600*24); //add seconds of one day

$new_date      = date("Y-m-d", $time_add);

echo $new_date;
joan16v
fonte
3
Às vezes, isso falha nas alterações do horário de verão quando a duração do dia não é de 24 horas.
Nik Dow
3

Eu sempre adiciono 86400 (segundos em um dia):

$stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00") + 86400);

echo 'date after adding 1 day: '.$stop_date; 

Não é a maneira mais fácil de fazer isso, mas funciona!

Doug Hays
fonte
Como você lida com segundos bissextos ao adicionar 86400 não funciona, pois há 86401 segundos naquele dia? (ok, eu sei que só acontece a cada poucos anos, mas dependendo do aplicativo isso pode ser importante)
Glen
1
Nem todos os dias têm 86400 segundos. De fato, na maioria dos lugares nos EUA, existem 3600 segundos a menos ou mais duas vezes por ano.
27468 Peter Kovacs
1
Você pode ignorar com segurança segundos bissextos, já que o "tempo Unix" faz isso. Este é um pouco complicado, mas ler este artigo para mais informações: derickrethans.nl/leap_seconds_and_what_to_do_with_them.php
Christian Daven
2
Você deve evitar esta solução. Aqui está o porquê: stackoverflow.com/questions/2613338/…
mspir
1
Não adicione data adicionando 86400 segundos ao dia anterior! Você terá um bug no seu código! Isso não funciona nos dias de verão!
Sbrbot 26/10/12
1

Embora eu concorde com a resposta de Doug Hays, grito aqui para dizer que o motivo pelo qual seu código não funciona é porque strtotime () espera uma INT como o segundo argumento, não uma string (mesmo que represente uma data)

Se você ativar o relatório de erros máximos, verá um erro "Um valor numérico não bem formado", que é o nível E_NOTICE.

Peter Bailey
fonte
1

O modify()método que pode ser usado para adicionar incrementos a um DateTimevalor existente .

Crie um novo DateTimeobjeto com a data e hora atuais:

$due_dt = new DateTime();

Depois de ter o DateTimeobjeto, você pode manipular seu valor adicionando ou subtraindo períodos:

$due_dt->modify('+1 day');

Você pode ler mais no manual do PHP .

Kal
fonte
0

O código a seguir obtém o primeiro dia de janeiro do ano atual (mas pode ser outra data) e adiciona 365 dias a esse dia (mas pode ser N número de dias) usando a classe DateTime e seu método modify () e format ( ):

echo (new DateTime((new DateTime())->modify('first day of January this year')->format('Y-m-d')))->modify('+365 days')->format('Y-m-d');
Carlos Espinoza
fonte
0

Como você já tem uma resposta para o que há de errado com seu código, posso trazer outra perspectiva de como você pode brincar com as datas em geral, e resolver seu problema especificamente.

Muitas vezes você se vê colocando um problema em termos de solução. Essa é apenas uma das razões pelas quais você acaba com um código imperativo . É ótimo se funcionar; existem apenas outras alternativas indiscutivelmente mais sustentáveis. Um deles é um código declarativo . O ponto é perguntar o que você precisa, em vez de como chegar lá.

No seu caso particular, isso pode se parecer com o seguinte. Primeiro, você precisa descobrir o que está procurando, ou seja, descobrir abstrações. No seu caso, parece que você precisa de um encontro . Não é apenas uma data qualquer, mas a que possui alguma representação padrão. Digamos, data ISO8601. Há pelo menos duas implementações: a primeira é uma data analisada de uma sequência formatada em ISO8601 (ou uma sequência em qualquer outro formato atualmente), e a segunda é uma data futura, um dia depois. Assim, o código inteiro pode ser assim:

(new Future(
    new DateTimeParsedFromISO8601('2009-09-30 20:24:00'),
    new OneDay()
))
    ->value();

Para mais exemplos com malabarismo com data e hora, confira este .

Vadim Samokhin
fonte