somar datas - PHP

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:

<input name="hoje" type="radio" value="radiobutton">
Hoje</td>
<td width="42%">
<input name="hojecampo" type="text" size="15" value="<? echo "" .date("d M Y");?>"readonly>
</td>
</tr>
<tr>
<td><input name="proximo" type="radio" value="radiobutton">
Inicio do proximo mês</td>
<td>
<input name="proximocampo" type="text" size="15" value="<?php $mes = mktime(0, 0, 0, date("m")+1, date("d"), date("y"));
echo "".date("1 M Y", $mes); ?>"readonly>
</td>
</tr>
<tr>
<td>Duração em meses:</td>
<td><select name="select" size="1" multiple>
<option selected>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
<option>11</option>
<option>12</option>
</select>
</td>
</tr>
<tr>
<td colspan="2">O seu contracto terá inicio em <? echo $inicio ?> e acabará a <? echo $fim ?> </td>
</tr>


cumprimentos
 
<?php
$hoje="25-12-2007";
$now = strtotime($hoje);
$fut =strtotime("+10 months",$now);
echo "De hoje ($hoje) a 10 meses será ".date("j-n-Y",$fut);

?>

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

probzk4.jpg
 
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:
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
 
mas agora a minha duvida é como intruduzo na base de dados mySQL os dados: duraçao em meses, inicio e fim???
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:
Back
Topo