Como subtrair duas datas, ignorando o horário de verão em PHP?
Pergunta
Eu estou tentando calcular o número de dias entre dois dias, mas eu estou correndo em problemas com o horário de verão. Aqui está o meu código:
function date_diff($old_date, $new_date) {
$offset = strtotime($new_date) - strtotime($old_date);
return $offset/60/60/24;
}
funciona bem, desde que os dias são ambos dentro do mesmo período de DST:
echo date_diff('3/15/09', '3/18/09'); // 3
Mas não se eles estão mais distantes:
echo date_diff('11/15/08', '3/18/09'); // 122.95833333333
Eu quero um número par de dias, e não se preocupam com DST. Acho que eu poderia arredondar o resultado, mas que se sente kludgy. Existe uma melhor maneira (fácil)? Eu não quero ter que escrever uma coisa de anos-dia-parsing-e-evitando contagem-bissextos todo se eu puder evitá-lo.
. (Nota: este tem de ser executado em php 5.1.6, de modo algum da data caracterizam em 5.3 podem não estar disponíveis)
Um pouco mais informação: Eu vou levar o deslocamento e adicioná-lo a outros datetimes que estão em um db, e eu quero apenas a parte do dia a mudança, e não a parte da hora. Acontece que o arredondamento não vai funcionar, de qualquer maneira, porque quando eu faço a adição fica desativada por uma hora na outra direção. Talvez haja uma melhor abordagem para todo o problema ....
Solução
Você pode usar http://ca3.php.net/date_default_timezone_set para definir o fuso horário para GMT assim não haverá nenhum deslocamento.
Como alternativa, você pode adicionar manualmente um deslocamento usando o date('I',$timetamp)
if ( date("I") == 1 ) { // "WE ARE MDT";
$timeZone = "MDT";
} else {
$timeZone = "MST";
}
Outras dicas
Força as datas para viver em um fuso horário sem Daylight Savings Time, GMT / UTC:
function date_diff($old_date, $new_date) {
$offset = strtotime($new_date . " UTC") - strtotime($old_date . " UTC");
return $offset/60/60/24;
}
echo date_diff('3/15/09', '3/18/09'); // 3
echo date_diff('11/15/08', '3/18/09'); // 123
Eu tentei o código 'UTC' acima. não funcionou para mim. I stll tem valores decimais.
Quando há data de Verão no intervalo de datas a parte decimal de série diferença será ou sob 0,5 ou mais. quando intervalo de datas tem dia salvando acontecendo 3/15 luz o valor decimal é> 0,5, quando o dia está saindo data decimal <.5. então eu só colocar a série diferença em uma função round () e fico com os números inteiros que eu preciso para o número de dias.