Jump to content


Photo

Soma Em Datas


  • Faça o login para participar
10 replies to this topic

#1 victormangia

victormangia

    Doutor

  • Usuários
  • 783 posts
  • Sexo:Masculino
  • Localidade:barra mansa - rj

Posted 06/01/2005, 13:16

galera to precisando faze o seguinte:

tenho que somar utilizando javascript uma determinada data com um numero de dias
tipo assim

10/10/2004 + 25 dias = 05/11/2004

a minha data esta nesse mesmo formato
dd/mm/aaaa

alguem sabe como fazer isso?

#2 Thales Medeiros

Thales Medeiros

    24 Horas

  • Usuários
  • 426 posts
  • Sexo:Não informado
  • Localidade:Juiz de Fora/MG
  • Interesses:Programação em geral. Programo em PHP, ASP, PERL, VB, Delphi, C/C++, Java e com banco d dados<br><br>Gosto tb d ajudar. Se precisar d mim, basta postar uma msg no Forum! Se eu souber, te responderei...

Posted 06/01/2005, 20:22

Oi, Victor! Blz?

Tive que fazer uma função assim na semana passada lá na empresa, então eu posso te ajudar. Não estou com a função aqui, mas a gente vai montando aos poucos até funfar...

A princípio, já sei que vamos precisar de uma função que retorne o número de dias de qualquer mês/ano. Vc entenderá depois. Aí vai a função:

function numdias(mes,ano) {
    //mês ímpar menor que 8 ou mês par maior que 7 tem 31 dias
    if((mes<8 && mes%2==1) || (mes>7 && mes%2==0)) return 31;

    //se não for fevereiro, os outros meses que não os de cima têm 30 dias
    if(mes!=2) return 30;

    //ano bissexto é múltiplo de 4
    if(ano%4==0) return 29;
    return 28;
}

Agora que temos uma função que verifica o número de dias, vamos criar nossa função que soma datas. Vou dar um exemplo pra mostrar seu funcionamento. Vou chamar de data a tal data à qual você deseja somar os dias.

data=data.split('/');

Agora temos data[0] como sendo o dia, data[1] o mês e data[2] o ano da data. Agora nós vamos somar 70 dias ao dia da data. Olha que loucura...

diafuturo=parseInt(data[0])+70;

Vamos supor que nossa data seja 25/11/2004, ok? Como somamos 70 a 25, então temos a variável "diafuturo" com o valor 70+25=95. Aí a gente faz assim:

mes=parseInt(data[1]);
ano=parseInt(data[2]);

while(diafuturo>numdias(mes,ano)) {
    diafuturo-=numdias(mes,ano);
    mes++;
    if(mes>12) {
        ano++;
        mes=1;
    }
}

Olha o que isto significa... Se a soma der um dia que seja menor ou igual ao número de dias do mês atual, ótimo! É como se somássemos 5 dias à data 5/2/2004. Dá 10/2/2004, sem necessidade de passar para o mês seguinte. Mas em nosso caso, entramos no loop, pois diafuturo=95, e o número de dias do mês 11/2004 é 30, portanto entraremos no loop while.

Dentro do loop while a gente faz isso: Tiramos da variável "diafuturo" o número de dias do mês atual. Ou seja: 95-30=65. Logo depois incrementamos a variável "mes". Se ao incrementarmos a gente passar para o mês 13, significa que passamos para o próximo ano. Basta fazer mes=1 e aumentar a variável "ano" em uma unidade. Agora temos a seguinte situação:

diafuturo=65
mes=12
ano=2004

Depois voltamos à condição do loop while. O mês atual é o mês 12 e a variável "diafuturo" vale 65. Verificamos se 65 é maior que o número de dias do mês atual (31). Como é verdade, entramos novamente no loop. Novamente tiramos da variável "diafuturo" o número de dias do mês atual (12/2004, que tem 31 dias). Portanto, "diafuturo" passa a valer 65-31=34. Mais uma vez incrementamos a variável mês, que antes valia 12 e passa a valer 13. Deste modo, aumentamos a variável ano de uma unidade e fazemos mes=1. Agora temos a seguinte situação:

diafuturo=34
mes=1
ano=2005

Mais uma vez entramos na condição do loop while, que verifica que "diafuturo" é maior que o número de dias do mês 1/2005 (31 dias), portanto entramos dentro do loop novamente. Fazemos agora "diafuturo" diminuir em 31 unidades (diafuturo=34-31=3) e aumentamos a variável mês, que agora vale 2. Veja a situação:

diafuturo=3
mes=2
ano=2005

Como agora "diafuturo" é menor que o número de dias deste mês (28 dias), saímos do loop e temos a data correta: 3/2/2005.

A função completa é a seguinte:

function somadias(data, dias) {
    data=data.split('/');
    diafuturo=parseInt(data[0])+dias;
    mes=parseInt(data[1]);
    ano=parseInt(data[2]);
    while(diafuturo>numdias(mes,ano)) {
        diafuturo-=numdias(mes,ano);
        mes++;
        if(mes>12) {
            mes=1;
            ano++;
        }
    }
    return diafuturo+"/"+mes+"/"+ano;
}

Faça este teste pra saber como funciona:

<html><head><title>Teste</title>
<script language=JavaScript>
function numdias(mes,ano) {
    if((mes<8 && mes%2==1) || (mes>7 && mes%2==0)) return 31;
    if(mes!=2) return 30;
    if(ano%4==0) return 29;
    return 28;
}

function somadias(data, dias) {
    data=data.split('/');
    diafuturo=parseInt(data[0])+dias;
    mes=parseInt(data[1]);
    ano=parseInt(data[2]);
    while(diafuturo>numdias(mes,ano)) {
        diafuturo-=numdias(mes,ano);
        mes++;
        if(mes>12) {
            mes=1;
            ano++;
        }
    }
    return diafuturo+"/"+mes+"/"+ano;
}

alert(somadias("25/11/2004",70));
</script>
</head>
<body></body></html>

Espero ter ajudado!

Um abraço,
Thales Medeiros.
Sucesso é ganhar dinheiro fazendo o que você faria de graça.

#3 victormangia

victormangia

    Doutor

  • Usuários
  • 783 posts
  • Sexo:Masculino
  • Localidade:barra mansa - rj

Posted 07/01/2005, 07:37

Valeu cara, tava procurando isso a meses.

#4 victormangia

victormangia

    Doutor

  • Usuários
  • 783 posts
  • Sexo:Masculino
  • Localidade:barra mansa - rj

Posted 07/01/2005, 07:49

Cara, ficaria muito complicado eu alterar esse script pra mostrar as datas nesse formato
dd/mm/aaaa? nao sei se vc reparou mais a data fica assim 7/2/2004 e teria que ficar assim
07/02/2004 pq eu to usando isso pra fazer uma consulta sql e assim d'a pau.

#5 Thales Medeiros

Thales Medeiros

    24 Horas

  • Usuários
  • 426 posts
  • Sexo:Não informado
  • Localidade:Juiz de Fora/MG
  • Interesses:Programação em geral. Programo em PHP, ASP, PERL, VB, Delphi, C/C++, Java e com banco d dados&lt;br&gt;&lt;br&gt;Gosto tb d ajudar. Se precisar d mim, basta postar uma msg no Forum! Se eu souber, te responderei...

Posted 07/01/2005, 14:20

Oi, Victor!

Já que só o código te interessou, mesmo, lá vai só o código;

function somadias(data, dias) {
   data=data.split('/');
   diafuturo=parseInt(data[0])+dias;
   mes=parseInt(data[1]);
   ano=parseInt(data[2]);
   while(diafuturo>numdias(mes,ano)) {
       diafuturo-=numdias(mes,ano);
       mes++;
       if(mes>12) {
           mes=1;
           ano++;
       }
   }

   /******ADICIONE ISTO AQUI******/
   if(diafuturo<10) diafuturo='0'+diafuturo;
   if(mes<10) mes='0'+mes;

   return diafuturo+"/"+mes+"/"+ano;
}

Um abraço,
Thales Medeiros.
Sucesso é ganhar dinheiro fazendo o que você faria de graça.

#6 HaroNism

HaroNism

    Super Veterano

  • Usuários
  • 13822 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 15/09/2017, 03:12

Baclofen Generique En France online pharmacy Cephalexin Package Insert
Buy Cialis Online Europe
Side Effects Of Alli Weight Loss Pills buy cialis Comprar Cialis En Canada

#7 HaroNism

HaroNism

    Super Veterano

  • Usuários
  • 13822 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 02/10/2017, 17:14

Finasteride Propecia Achat Effetti Cialis 10 Cialis Periodo Refrattario viagra Order Bulk Cialis
Healthy Male generic viagra levitra Dianiben 850 No Prescription Where to buy generic isotretinoin isotrex shop
Buy Metoprolol Without Scrop Manly 100mg Review Finasteride Delivered levitra 20mg prix El Cialis Funciona Zithromax Antibiotic Over The Counter

#8 HaroNism

HaroNism

    Super Veterano

  • Usuários
  • 13822 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 10/10/2017, 16:49

Photos De Pilules Amoxil Amoxicillin For Colds Cialis Omeprazolo viagra prescription Vorzeitiger Samenerguss Levitra Dostinex Mg Come Usare Dapoxetina
Medicamento Cialis 10 Low Price On Cialis Canada cialis online Achat Viagra Ligne France En Sarcelles
Canadian Meds Without An Rx Cialis De 5 Mg viagra Cialis Lilly Preisvergleich Cialis Indonesia

#9 HaroNism

HaroNism

    Super Veterano

  • Usuários
  • 13822 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 27/10/2017, 20:21

Buy Cafergot With No Prescription Line sildenafil tadalafil and vardenafil Acheter Tadalafil 40mg
Fedex Shipping Stendra Find Mastercard Basildon How Good Is Kamagra viagra Achat Viagra Pfizer
Levitra Niedriger Blutdruck viagra Viagra En Ligne Danger Generic Viagra Online Canadian Pharmacy

#10 LarPhozyHah

LarPhozyHah

    Super Veterano

  • Usuários
  • 14515 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 27/10/2017, 23:15

Secure Place To Buy Yasmin Online Kamagra Overnight Delivery Levitra Da Banco online pharmacy Buy Orlistat From Mexico Vente De Cialis 5 Mg

#11 HaroNism

HaroNism

    Super Veterano

  • Usuários
  • 13822 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 12/11/2017, 22:07

Rash On Chest Amoxicillin viagra Achat Du Levitra En Belgique
Where To Buy Nexium viagra Cost For Cialis From Walmart 165 Buy Vagria Hytrin
Canadian Pharmacy Levitra Xenical Online Kaufen Ohne Rezept Online Medication For Gonorrhea buy viagra Levitra 10 Mg Precio




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq