$ date + 1 ano?

87

Estou tentando obter uma data que seja um ano a partir da data que especificar.

Meu código é parecido com este:

$futureDate=date('Y-m-d', strtotime('+one year', $startDate));

Ele está retornando na data errada. Alguma ideia por quê?

Matt
fonte
9
Você se esqueceu de contar sobre o erro.
BalusC
Frank Farmer: você tem tanta certeza? Prefiro esperar pelas retificações / comentários da OP.
BalusC
Na minha pressa de postar isso ontem à noite esqueci de esclarecer - estava retornando na data errada. Desculpe! Obrigado pela ajuda.
Matt
1
Use-o desta forma strtotime ('+ 1 ano', $ startDate));
casivaagustin

Respostas:

97

Para adicionar um ano à data de hoje, use o seguinte:

$oneYearOn = date('Y-m-d',strtotime(date("Y-m-d", mktime()) . " + 365 day"));

Para os outros exemplos, você deve inicializar $ StartingDate com um valor de carimbo de data / hora, por exemplo:

$StartingDate = mktime();  // todays date as a timestamp

Tente isto

$newEndingDate = date("Y-m-d", strtotime(date("Y-m-d", strtotime($StaringDate)) . " + 365 day"));

ou

$newEndingDate = date("Y-m-d", strtotime(date("Y-m-d", strtotime($StaringDate)) . " + 1 year"));
Nidhin Baby
fonte
Adicionar "+365" em vez de "+1 ano" resolveu. Obrigado!
Matt
16
Isso não quebraria no caso de um ano bissexto?
Jeremy1026
1
A partir do PHP 5.1, quando chamado sem argumentos, mktime () lança um aviso E_STRICT: use a função time () ao invés.
svandragt
Votos negativos aqui também. O número de segundos em um dia, dias em um ano, segundos em um ano, etc. são todos variáveis. Se você está interessado em 'daqui a um ano', você deve passar em um intervalo de 'um ano'. Subdividir por conta própria é o que leva a erros em dias bissextos e segundos bissextos e mudanças de horário de verão. Pior ainda, isso causa testes de unidade de flappy.
drobert de
por que minha resposta foi rejeitada ?? $ addedoneyear = date ("y") + 1; // por adicionar um ano, o que há de errado nisso?
pathe.kiran
212
$futureDate=date('Y-m-d', strtotime('+1 year'));

$ futureDate é daqui a um ano!

$futureDate=date('Y-m-d', strtotime('+1 year', strtotime($startDate)) );

$ futureDate é um ano a partir de $ startDate!

Misho
fonte
Observe que se $ startDate já for um timestamp (como um criado anteriormente com a função time () ou mktime ()) e não uma string, você não deve envolvê-lo em strtotime ou não funcionará. Em vez disso, faça $futureDate=date('Y-m-d',strtotime('+1 year',$startDate));como K Prime mencionado abaixo.
dallin
9

Tentar: $futureDate=date('Y-m-d',strtotime('+1 year',$startDate));

K Prime
fonte
Enquanto isso retorna a resposta certa, o outro também não retorna um erro ... apenas a data errada.
SeanJA
1
strtotime não gera erros. Ele retorna falso em caso de erro.
Frank Farmer
O PHP irá lançar avisos se o fuso horário padrão não for definido ... embora aparentemente não seja isso o que ele quis dizer
SeanJA
Eu estava recebendo um erro no seu código ,para o qual mudei .e funcionou date("Y-m-d",strtotime('+1 year '.$startDate));
Muhammad Bilal
7
// Declare a variable for this year 
$this_year = date("Y");
// Add 1 to the variable
$next_year = $this_year + 1;
$year_after = $this_year + 2;

// Check your code
    echo "This year is ";
    echo $this_year;
    echo "<br />";
    echo "Next year is ";
    echo $next_year;
    echo "<br />";
    echo "The year after that is ";
    echo $year_after;
AnarchyOutlaw
fonte
6

apenas tive o mesmo problema, porém esta foi a solução mais simples:

<?php (date('Y')+1).date('-m-d'); ?>
Gardenee
fonte
Ótimo, eu usá-lo para obter o próximo ano: $next_year = (date('Y')+1).
Martin
5
//1 year from today's date
echo date('d-m-Y', strtotime('+1 year'));

//1 year from from specific date
echo date('22-09-Y', strtotime('+1 year'));

espero que este código mais simples ajude alguém no futuro :)

Desenvolvedor
fonte
4

Eu prefiro a abordagem OO:

$date = new \DateTimeImmutable('today'); //'today' gives midnight, leave blank for current time.
$futureDate = $date->add(\DateInterval::createFromDateString('+1 Year'))

Use, DateTimeImmutablecaso contrário, você modificará a data original também! mais sobre DateTimeImmutable: http://php.net/manual/en/class.datetimeimmutable.php


Se você quer apenas a partir da data de hoje, você sempre pode fazer:

new \DateTimeImmutable('-1 Month');
Andrew Atkinson
fonte
3

Se você estiver usando PHP 5.3, é porque precisa definir o fuso horário padrão:

date_default_timezone_set()
SeanJA
fonte
3

strtotime()está retornando bool(false), porque ele não pode analisar a string '+one year'(ele não entende "um"). falseestá sendo implicitamente convertido para o integercarimbo de data / hora 0. É uma boa ideia verificar se strtotime()a saída de não está bool(false)antes de você colocá-la em outras funções.

Dos documentos:

Valores Retornados

Retorna um timestamp em caso de sucesso, FALSE caso contrário. Anterior ao PHP 5.1.0, esta função retornava -1 em caso de falha.

Frank Farmer
fonte
Sim, bom ponto. Meu código de produção terá isso, mas eu estava arrancando meus cabelos tentando fazer isso funcionar, então reduzi-o ao mínimo de código possível. Obrigado!
Matt
2

Tente isto

$nextyear  = date("M d,Y",mktime(0, 0, 0, date("m",strtotime($startDate)),   date("d",strtotime($startDate)),   date("Y",strtotime($startDate))+1));
Treby
fonte
1

Também existe uma solução mais simples e menos sofisticada:

$monthDay = date('m/d');
$year = date('Y')+1;
$oneYearFuture = "".$monthDay."/".$year."";
echo"The date one year in the future is: ".$oneYearFuture."";
Daniel Lima
fonte
1

Minha solução é: date('Y-m-d', time()-60*60*24*365);

Você pode torná-lo mais "legível" com definições:

define('ONE_SECOND', 1);
define('ONE_MINUTE', 60 * ONE_SECOND);
define('ONE_HOUR',   60 * ONE_MINUTE);
define('ONE_DAY',    24 * ONE_HOUR);
define('ONE_YEAR',  365 * ONE_DAY);

date('Y-m-d', time()-ONE_YEAR);
Adam Mester
fonte
-1

No meu caso (quero adicionar 3 anos à data atual), a solução foi:

$future_date = date('Y-m-d', strtotime("now + 3 years"));

Para Gardenee, Treby e Daniel Lima: o que vai acontecer no dia 29 de fevereiro? Às vezes, fevereiro tem apenas 28 dias :)

aiuen
fonte