Ir para conteúdo
Fórum Script Brasil
  • 0

será que strtotime é confiavel?


Halfar

Pergunta

tem uma funcao que peguei aqui no forum para calcular quantos meses tem entre duas datas. veja um exemplo abaixo:

<?

$data1 = strtotime(20060828);

$data2 = strtotime(20080414);

$maior = max($data1, $data2);

$menor = min($data1, $data2);

$seg = $maior - $menor;

$dias = (($seg /60) /60) /24;

echo $dias . "<P>";

$meses = $dias / 30;

echo $meses;

?>

O numero de meses que esta funcao retorna é 19.833333333333

Mas creio que deveria retornar 19,5624

A diferenca é pequena, mas gera uma dúvdia. Se fizer este calculo na ponta do lapis temos o seguinte:

Do dia 28082006 a 31-08-2006 temos 4 dias. então para saber quantos meses proporcionais tem dentro destes 4 dias, basta dividir os 4 dias do mes de agosto por 31, então temos :0.1290322

Do dia 1 de setembro de 2006 até 31-03-2008 temos: 19 meses

E do dia 1 ao dia 14 de abril de 2008 temos 13 dias. então dividimos 13 por 30 dias do mes de abril temos: 0.433333

Agora é só somar tudo:

0.1290322 + 19 + 0.433333 = 19.5624

então resolvi isolar os resultados, e peguei e coloquei na funcao para calcular os 4 dias de 28082006 a 31-08-2006. A funcao retorna 3 dias. Entendo que deveria retornar 4 dias.

Depois um outro detalhe que noto nesta formula, é que para calcular os meses é dividido por 30 dias, é um numero generico, pois tem mes que tem 30, 31, 28 ou 29 dias...

Acho que esta formula ai não é muito certa não...

concordam comigo?

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

obrigado pela resposta, quanto a sua observação:

"Do dia 28/08/2006 ao dia 3108/2006 são 3 dias de diferença, e não 4 como você diz que deveria ser..."

Voce diz que na regra matematica nunca se conta o ponto de partida.

Mas me parece que na realidade de calculo de juros, folha de pagamento, pelo jeito parece que conta sim. Mas para saber o realmente certo disto vamos analisar assim:

o primeiro dia é 28. O dia 28 começa as 00:00 horas (meia noite).

Da meia noite do dia 28 até meia noite do dia 29 - temos 1 dia.

Da meia noite do dia 29 até meia noite do dia 30 temos mais um dia.

Da meia noite do dia 30 até meia noite do dia 31 temos mais um dia.

até aqui temos 3 dias. mas veja só, a ultima contagem é ate a meia noite do dia 31, ou seja, o dia 31 está começando, aqui não termina o dia 31 e sim começa. Para terminar o dia 31, tem que transcorrer o dia 31 todo que findará a meia noite do dia primeiro. então temos mais um dia transcorrido.

Totalizando portanto 4 dias.

Realmente é uma coisa meio complicada mesmo. Porque a pergunta que se faz é : quantos dias tem entre as datas. É o "entre" que precisa ficar bem entendido.

Se voce falar quais os numeros que existem entre o 1 e o 5, a resposta seria: o dois, o tres e o quatro. É a resposta mais fácil, mais comum que se ve por ai, mas onde começa e um, e onde termina o 5. Se voce pensar nas datas, dentro datas tem dias, horas e segundos, aí o entendimento precisa se estender um pouco mais, analisando da maneira como expus acima, com os calculos que comecam a meia noite.

Para nós seres mortais isto parece bobagem, mas estes calculos quando feito para bancos, que trabalham com grandes cifras de dinheiro, faz muita diferença...

Bem, mas tudo bem, ei postei este tópico mesmo para ver se apareceria alguém como voce para debater este assunto. Quanto ao a minha funcao strtotime creio que vou retira-la de meu codigo e fazer uma outra funcao que chegue a um resultado mais coerente...

Link para o comentário
Compartilhar em outros sites

  • 0

Mas esses cálculos são diferentes porque contam os dias correntes junto, e o sttotime() trabalhará com diferenças entre dias.

Não é que foge da regra, mas o modo de calcular é diferente, e para você fazer os cálculos corretamente, teria que trabalhar não com dias, mas com horas, assim cada vez que tivesse uma sobra em horas ele contaria mais um dia.

Isso aí é arredondamento mesmo.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...