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 ....

Foi útil?

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

Você pode forçar o arredondamento em uma direção específica usando floor() ou ceil() .

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top