Avançando pelas datas relativas usando strtotime()
Pergunta
estou tentando usar strtotime()
para responder a um botão, clique para avançar -1 e +1 dias (dois botões) em relação ao dia avançado no clique anterior.
Exemplo:
- É dia 10 do mês, clico no botão "-1 dia" e agora a data é 9.
- Clico no botão "-1 dia" novamente e agora a leitura indica o 8º dia.
- Clico no botão "+1 dia" e agora a leitura indica que é dia 9.
Eu entendo os botões e a exibição da data e o uso $_GET
e PHP para passar informações, mas como faço para strtotime()
trabalhar na data relativa à última vez que o roteiro de viagem no tempo foi chamado?
Meu trabalho até agora me permitiu mostrar o ontem e o hoje em relação agora mas não em relação, por exemplo, ao anteontem, ou o dia depois de Amanhã.Ou se eu usar meu "última segunda-feira" botão, um dia antes ou depois do que quer que seja esse dia.
Solução
Trabalhar a partir de chamadas anteriores para o mesmo script não é uma boa ideia para esse tipo de coisa.
O que você quer fazer é sempre passar dois valores para o seu script, a data e o movimento.(o exemplo abaixo é simplificado para que você passe apenas a data, e sempre adicionará um dia a ela)
Exemplo
http://www.site.com/addOneDay.php?date=1999-12-31
<?php
echo Date("Y-m-d",(strtoTime($_GET[date])+86400));
?>
Por favor, note que você deve verificar se isset($_GET[date]) antes também
Se você realmente deseja trabalhar a partir de chamadas anteriores para o mesmo script, terá que fazê-lo com sessões, portanto especifique se for esse o caso.
Outras dicas
Kevin, você trabalha com uma base absoluta sólida (ou seja,uma data/hora), não um período de tempo relativo.Em seguida, você converte para os períodos de tempo relativos.Assim, por exemplo, por padrão, se você estivesse mostrando um calendário, trabalharia a partir da data de hoje.
int strtotime ( string $time [, int $now ] )
Você pode ver na definição da função aqui de strtotime, o segundo argumento é agora, ou seja,você pode alterar a data a partir da qual é relativo.
Isso pode ser mais fácil de exibir por meio de um loop rápido
Isso percorrerá os últimos 10 dias usando "ontem" como primeiro argumento.Em seguida, usamos data para imprimi-lo.
$time = time();
for ($i = 0; $i < 10; $i++) {
$time = strtotime("yesterday", $time);
print date("r", $time) . "\n";
}
Portanto, passe a hora/data através do URI para que você possa salvar a data relativa.
Após um momento de inspiração, a solução para a minha pergunta tornou-se evidente para mim (eu estava andando de bicicleta).A parte '$agora' de
strtottime( string $time {,int $now ])
precisa ser definido como a data atual.Não "$time()-now", mas "a data atual com a qual estou preocupado/estou olhando meu log.
ou seja:se estou olhando o resumo do quadro de horários de 10/08/2008, então isso é "agora" de acordo com strtotime();ontem é 09/08 e amanhã é 11/08.Uma vez que eu rastejo um dia, "agora" é 11/08, ontem é 10/08 e amanhã é 12/08.
Aqui está o exemplo de código:
<?php
//catch variable
$givendate=$_GET['given'];
//convert given date to unix timestamp
$date=strtotime($givendate);
echo "Date Set As...: ".date('m/d/Y',$date)."<br />";
//use given date to show day before
$yesterday=strtotime('-1 day',$date);
echo "Day Before: ".date('m/d/Y',$yesterday)."<br />";
//same for next day
$tomorrow=strtotime('+1 day',$date);
echo "Next Day: ".date('m/d/Y',$tomorrow)."<br />";
$lastmonday=strtotime('last monday, 1 week ago',$date);
echo "Last Moday: ".date('D m/d/Y',$lastmonday)."<br />";
//form
echo "<form method=\"get\" action=\"{$_SERVER['PHP_SELF']}\">";
//link to subtract a day
echo "<a href=\"newtimetravel.php?given=".date('m/d/Y',$yesterday)."\"><< </a>";
//show current day
echo "<input type=\"text\" name=\"given\" value=\"$givendate\">";
//link to add a day
echo "<a href=\"newtimetravel.php?given=".date('m/d/Y',$tomorrow)."\"> >></a><br />";
//submit manually entered day
echo "<input type=\"submit\" name=\"changetime\" value=\"Set Current Date\">";
//close form
echo "<form><br />";
?>
Clicar nos botões “<<” e “>>” avança e recua o dia em questão