1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

somar datas - PHP

Discussão em 'Web Development' iniciada por damaged, 12 de Dezembro de 2007. (Respostas: 11; Visualizações: 2750)

  1. damaged

    damaged Power Member

    boas pessoal aki tou eu com mais uma duvida e penso q esta seja complicadita

    é o seguinte

    tenho 2 radiobuttons cada um com uma textbox á frente e cada uma indica uma data diferente..
    depois escolho quais dessas datas quero e em baixo tenho uma selectbox que indica quantos meses quero adicionar á data que escolhi...

    e depois no fim vou ter dois echos da data que escolhi do radio button e a data final (que é a soma da data que escolhi com os meses que escolhi no select)

    estava a tentar fazer uma function em javascript mas isto nao vai dar em nada...

    espero ter me explicado bem

    o que eu tenho neste momento é algo do genero:


    cumprimentos
     
  2. mcog_blaster

    mcog_blaster Power Member

    Para somar datas, provavelmente o melhor é usares strtotime
     
  3. damaged

    damaged Power Member

    tou quase na mesma :banana:
     
  4. K0mA

    K0mA Power Member

    >> De hoje (25-12-2007) a 10 meses será 25-10-2008 <<

    Procura bem no php.net estão lá vários exemplos.
     
    Última edição: 13 de Dezembro de 2007
  5. slack_guy

    slack_guy Power Member

    Parece-me que o que queres é JavaScript e não PHP, uma vez que pretendes mostrar o resultado no momento em que seleccionas os valores - isto é, antes de mandares o formulário de volta para o servidor.

    Deve ser qualquer coisa do género (sem as selects e os radio buttons.... que deixo à tua imaginação :-) ):
    Código:
    <html>
        <head></head>
        <body>
    
            <script type='text/javascript'>
    
                // estas datas são as que vêem do select
                var data1 = new Date(2007,10,13);
                var data2 = new Date(2007,11,13);
    
                document.write(
                        'DATAS INICIAIS<br />'
                        + '---------------------------<br />'
                        + 'Data 1: ' + data1.toLocaleDateString() + '<br />'
                        + 'Data 2: ' + data2.toLocaleDateString() + '<br /><br />'
                        );
    
                // Adicionamos 3 meses a data1
                var data1_mod1 = new Date(calcData(data1,'mes','+',3));
    
                // Adicionamos 1 ano a data1
                var data1_mod2 = new Date(calcData(data1,'ano','+',1));
    
                // Adicionamos 18 dias a data1
                var data1_mod3 = new Date(calcData(data1,'dia','+',18));
    
                // Subtraimos 10 meses a data2
                var data2_mod1 = new Date(calcData(data2,'mes','-',10));
    
                // Subtraimos 3 anos a data2
                var data2_mod2 = new Date(calcData(data2,'ano','-',3));
    
                // Subtraimos 386 dias a data2
                var data2_mod3 = new Date(calcData(data2,'dia','-',386));
    
                document.write(
                        'CALCULOS<br />'
                        + '---------------------------<br />'
                         + 'Data 1 + 3 meses: '  + data1_mod1.toLocaleDateString() + '<br />'
                         + 'Data 1 + 1 ano: '    + data1_mod2.toLocaleDateString() + '<br />'
                         + 'Data 1 + 18 dias: '  + data1_mod3.toLocaleDateString() + '<br />'
                         + 'Data 2 - 10 meses: ' + data2_mod1.toLocaleDateString() + '<br />'
                         + 'Data 2 - 3 anos: '   + data2_mod2.toLocaleDateString() + '<br />'
                         + 'Data 2 - 386 dias: ' + data2_mod3.toLocaleDateString() + '<br />'
                        );
    
                function calcData(origem,tipo,op,cont) {
    
                    var mdata = new Date(origem);
    
                    switch(tipo) {
    
                        case 'dia':
                            return new Date(mdata.setDate(
                                        op == '-'
                                        ? mdata.getDate() - cont 
                                        : mdata.getDate() + cont
                                        ));
    
                        case 'mes':
                            return new Date(mdata.setMonth(
                                        op == '-'
                                        ? mdata.getMonth() - cont 
                                        : mdata.getMonth() + cont
                                        ));
    
                        case 'ano':
                            return new Date(mdata.setFullYear(
                                        op == '-'
                                        ? mdata.getFullYear() - cont 
                                        : mdata.getFullYear() + cont
                                        ));
    
                        default:
                            return origem;
    
                    }
                }
    
            </script>
        </body>
    </html>
    
    Que dá o resultado:
    Código:
    DATAS INICIAIS
    ---------------------------
    Data 1: 13-11-2007
    Data 2: 13-12-2007
    
    CALCULOS
    ---------------------------
    Data 1 + 3 meses: 13-02-2008
    Data 1 + 1 ano: 13-11-2008
    Data 1 + 18 dias: 01-12-2007
    Data 2 - 10 meses: 13-02-2007
    Data 2 - 3 anos: 13-12-2004
    Data 2 - 386 dias: 22-11-2006
    
    Isto não é exactamente o código que pretendes, mas dá-te algumas pistas... ou não.
     
  6. CoolMaster

    CoolMaster Power Member

    O melhor é passares tudo para segundos (Unix time) com o mktime() , somar e depois voltar a passar para o formato que queres! em 3 Linhas ta feito.
     
  7. damaged

    damaged Power Member

    k0mA o meu problema é um bocado mais complexo q isso nao sei digo eu...
    se calhar se kisesse so somar variaveis de datas... se calhar n vinha aki expor o meu problema.. mas sim pesquisava prai...

    o q eu tenho é isto:

    [​IMG]
     
  8. slack_guy

    slack_guy Power Member

    Estás a usar AJAX?
     
  9. slack_guy

    slack_guy Power Member

    Será isto que pretendes (grava o código num ficheiro .htm):
    (NOTA: Só testei no firefox e no opera. Não sei se resulta no IE.)

    Código:
    <html>
        <head>
            <title>TESTE</tile>
    
                <script type='text/javascript'>
                function calcDuracao(op) {
    
                    var opcoes = document.getElementsByName('opcao');
                    var arrdata = new Array;
                    var nmeses = Number(op.value);
    
                    for (i = 0; i <= opcoes.length; i++)  {
                        if (opcoes[i].checked) {
                            arrdata = opcoes[i].value.split('-');
                            break;
                        }
                    }
    
                    var data = new Date(arrdata[2], arrdata[1] - 1, arrdata[0]);
                    var data_inicio = new Date(data);
                    var data_fim = new Date(data.setMonth(data.getMonth() + nmeses));
                    data_fim = new Date(data_fim.setDate(data_fim.getDate() - 1));
    
                    document.getElementById('inicio').innerHTML = data_inicio.toLocaleDateString();
                    document.getElementById('fim').innerHTML = data_fim.toLocaleDateString();
    
                }
    
    </script>
    <body>
        <form>
            <h1>Duração do contrato</h1>
            <p />Início:<br /><input type='radio' name='opcao' id='op1' value='13-12-2007' checked='ckecked' /><label for='op1'>Hoje (13-12-2007)</label>
            <br /><input type='radio' name='opcao' id='op2' value='1-1-2008' /><label for='op2'>Início do próximo mês (1-1-2008)</label>
            <p />Duração (meses) <select id='duracao' onchange="calcDuracao(this);">
                <option value='1'>1</option>
                <option value='2'>2</option>
                <option value='3'>3</option>
                <option value='4'>4</option>
                <option value='5'>5</option>
                <option value='6'>6</option>
            </select>
            <p />O seu contrato tem início em <span id='inicio'>-----</span> e termina em <span id='fim'>-----</span>.
        </form>
    </body>
    </html>
    
    Dúvidas?
     
    Última edição: 14 de Dezembro de 2007
  10. damaged

    damaged Power Member

    epa espetacular mesmo
    obrigadao

    mas agora a minha duvida é como intruduzo na base de dados mySQL os dados: duraçao em meses, inicio e fim???

    é q tu usas ai comandos q desconhecia mesmo e q n sao variaveis.. logo axo q n consigo mandar isso prá BD
     
  11. slack_guy

    slack_guy Power Member

    qual é a dificuldade?
    Código:
    duracao -> int
    inicio -> date
    fim -> date
    
    Por segurança, aconselho-te a fazeres as mesmas contas (como já te foi explicado mais acima para PHP) no lado do servidor, isto é, quando fazes o Post do formulário. Se pensares com calma, fazes isto com uma perna às costas :-)

    Para gravar na BD, só precisas de saber:
    1. a opção seleccionada : data actual ou inicio próximo mês ?
    2. duração do contrato : inteiro

    Depois, é fazeres as contas mas em PHP. Independentemte da opção em 1, incrementas N meses (- 1 dia) à data inicial e tens a data final.
     
    Última edição: 14 de Dezembro de 2007

Partilhar esta Página