Simplifique
Postado por xorna em February 14th, 2008 salvo em Desenvolvimento, PHP, Software LivreBem, depois de um bom tempo sem escrever nada, devido a correria desse mês de carnaval e outras coisas. Peço humildemente desculpas àqueles que aqui vieram e não puderam ler nada de novo, mas sinceramente, não tive tempo. Além de tudo isso, comunico que daqui em diante vai ser um pouco escasso os artigos, pois além de todo o serviço, estou planejando minha viagem ao Canadá em Maio deste ano, lá vou estudar 6 meses inglês na Upper Madison College, e farei um estágio de mais 6 meses, espero que tudo ocorra sem complicações até lá, e depois também.Bem, sem me alongar em assuntos fora do escopo do artigo, vamos começar.
O motivo de eu escrever esse artigo, é tão simples quanto o que será proposto nele, uma complementação ao ótimo artigo de manipulação de datas do meu amigo Rafael Jaques em seu blog. Recentemente precisei fazer algumas manipulações um pouco mais avançadas para ter diferença de dias e meses entre datas pré-estabelecidas em um sistema de consulta de tributos municipais.
Mas como estamos sempre em busca de complicar as coisas que fazemos (isso é verdade), as vezes não nos damos o luxo de simplificar a solução de problemas, como que se nosso trabalho fosse uma competição de algoritmos obscuros. Meu problema consistia em pegar a diferença em dias e meses entre a data de vencimento da dÃvida e da data de pagamento escolhida pela pessoa que irá imprimir o boleto de pagamento.
A diferença entre dias, graças ao meu amigo Rafael Jaques foi tranquila, abaixo segue o exemplo de como implementei:
<?php
# Pegando as datas de vencimento
# Utilizei este formato por que normalmente é utilizado
# no tipo date do banco de dados
$data_vencimento = ‘2005-05-11′;
$data_pagamento = ‘2008-02-14′;# Transformar a data em um array
# Afim de obter os dados separadamente
# [0] = ano
# [1] = mes
# [2] = dia
$data_vencimento_array = explode(’-', $data_vencimento);
$data_pagamento_array = explode(’-', $data_pagamento);# Usar o mktime para ter o retorno em segundos desde o inÃcio do Unix Epoch até a data comparada
$tempo_vencimento = mktime(0, 0, 0, $data_vencimento_array[1], $data_vencimento_array[2], $data_vencimento_array[0]);
$tempo_pagamento = mktime(0, 0, 0, $data_pagamento_array[1], $data_pagamento_array[2], $data_pagamento_array[0]);# Calcula a diferença em segundo da data de vencimento até a data de pagamento
# E divide isso por 86400 para obter esse tempo em dias
# 60 * 60 * 24 = 86400
# min->hora->dia
$diferenca_dias = ceil(($tempo_pagamento - $tempo_vencimento) / 86400);# Ao final escrevemos o resultado
print “A diferença entre $data_vencimento e $data_pagamento é de $diferenca_dias dias”;# Resultado
# A diferença entre 2005-05-11 e 2008-02-14 é de 1009 dias
?>
Tudo muito legal, muito bonito, mas depois disso veio o problema, como eu ia transformar isso em meses? Pois é, pensei até em usar uma média de dias em um mês durante certo tempo, mas não me dava a precisão necessária para um sistema desses, após tentar algumas fórmulas, estava decidido a usar alguma função por ae escrita por “caras” do php.
Mas após uma conversa com um amigo meu, o Osmar da Infotecbg, ele me disse o seguinte:
Osmar: Posso te dar uma dica André?
Eu: Claro, aliás, deve!
Osmar: Em Cobol eu faço assim: ((ano_pagamento - ano_vencimento) * 12) + (mes_pagamento - mes_vencimento)
Eu parei e pensei, pensei, testei e falei:
Poxa vida, e eu aqui querendo reiventar a roda, realmente, você simplificou minha vida, muito obrigado.
Como vocês podem notar, as vezes, linguagens de programação ricas em funções, classes e métodos não nos permitem pensar simples e objetivamente afim de resolver um problema simples, acaba-se criando um monstro, quando na verdade estamos diante de um pequeno gatinho inofensivo. Abaixo segue o exemplo tomado em php:
<?php
# Pegando as datas de vencimento
# Utilizei este formato por que normalmente é utilizado
# no tipo date do banco de dados
$data_vencimento = ‘2005-05-11′;
$data_pagamento = ‘2008-02-14′;# Transformar a data em um array
# Afim de obter os dados separadamente
# Onde:
# [0] = ano
# [1] = mes
# [2] = dia
$data_vencimento_array = explode(’-', $data_vencimento);
$data_pagamento_array = explode(’-', $data_pagamento);# Simples Calculo da diferenca de meses
$diferenca_meses = (($data_pagamento_array[0] - $data_vencimento_array[0]) * 12) + ($data_pagamento_array[1] - $data_vencimento_array[1]);# Escreva o resultado
print “A diferença de meses entre $data_vencimento e $data_pagamento é de $diferenca_meses meses”;
# A diferença de meses entre 2005-05-11 e 2008-02-14 é de 33 meses
?>
Para finalizar, é recomendável sempre termos contato com alguma tecnologia mais modesta em termos de funcionalidades, como C, Cobol, Pascal, apenas para podermos praticarmos algoritmos para resolver pequenos problemas.

February 15th, 2008 em 5:09 pm
Show de bola Xorna!
Exatamente o que conversamos.
Muitas vezes precisamos não pensar em uma linguagem de programação especÃfica, mas sim, na lógica, no algoritmo do sistema.
Que não se limita apenas a sintaxe da linguagem.