maanden optellen bij datum

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Hawtin
  • Registratie: Januari 2010
  • Laatst online: 10-10-2018
Hallo Tweakers

We nemen een 5 textboxjes, waarvan 3 om een datum te vormen: [dd]-[mm]-[jjjj] en de andere twee om een x aantal jaren en maanden bij deze datum op te tellen: [mm] [jj]

Al vele uren ben ik met dit probleem bezig, maar mijn hersenen zitten in een loopje en ik ben staat om wat haren uit mijn hoofd te trekken. Mijn bedoeling is dat ik de maanden bij de gegeven datum op tel zonder dat de dagen doortellen naar de volgende maand. Als je bijvoorbeeld 31-1 hebt en je zou hier via de normale javascript manier
JavaScript:
1
datum.setMonth(datum.getMonth() + maand.value * 1
een maand bij optellen kom je uit op 2-3. Ik moet echter 28-2 of 29-2 hebben, afhankelijk van of het jaar een schrikkeljaar is.

Ik heb de code al vele malen overhoop gegooid maar ik ben met deze lap code het dichtste in de buurt gekomen:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function bereken_uitkeringsduur(maand, jaar) {
    if ((document.formulier.uitkeringsduur_maand.value != '' && IsNumeric(document.formulier.uitkeringsduur_maand.value) == true) || (document.formulier.uitkeringsduur_jaar.value != '' && IsNumeric(document.formulier.uitkeringsduur_jaar.value) == true) ) {
        var x = new Date(document.formulier.jaar1.value, document.formulier.maand1.value -1, document.formulier.dag1.value);

        if (maand != '' && maand != '0' && maand != '00') {
            x.setMonth(x.getMonth() + maand.value * 1);
        }
        if (jaar != '') {
            x.setFullYear(x.getFullYear() + jaar.value * 1);
        }
        
        document.forms['formulier'].maand2.value = x.getMonth();
        if (x.getMonth() != (document.forms['formulier'].maand1.value * 1 + maand.value * 1)) {
            document.forms['formulier'].maand2.value = x.getMonth() - 1;
            var y = new Date(x.getFullYear(), x.getMonth() - 1, 0);
            document.forms['formulier'].dag2.value = y.getDate();
        } else {
            document.forms['formulier'].dag2.value = x.getDate();
        }
        document.forms['formulier'].jaar2.value = x.getFullYear();
    }
}


Via Google kwam ik uit bij de date.js library en moment.js, maar beiden libs geven mij niet de mogelijkheid om een x aantal maanden op een manier dat x ook x blijft. Wat javascript in feite doet is 30.3 dagen toevoegen aan een datum voor zover ik heb begrepen.

;w

Acties:
  • 0 Henk 'm!

  • webfreakz.nl
  • Registratie: November 2003
  • Laatst online: 07-07 14:23

webfreakz.nl

el-nul-zet-é-er

Je zoekt de laatste dag van een maand?

"You smell that, son? What sir? Napalm, I love the smell of napalm in the mornin!" || Children of Bodom fan!


Acties:
  • 0 Henk 'm!

  • curkey
  • Registratie: Mei 2009
  • Laatst online: 10-07 20:37
Als het puur om het hele aantal maanden gaat, kun je dan niet simpelweg vanaf de 1e van de peilmaand gaan tellen? De dag lijkt me niet relevant in dit geval.

Als het wel uitmaakt, misschien is het dan beter om eerst de datum naar de volgende maand te zetten, de offset erbij op te tellen en dan het aantal dagen dat je verder hebt geteld er weer af te trekken.

Acties:
  • 0 Henk 'm!

  • MaximusTG
  • Registratie: April 2003
  • Niet online
(overleden)
Wat je dus eigenlijk wil is dat je de datum krijgt die overeenkomt met een even groot deel (naar rato) van de volgende maand? Dus stel idd het is januari, en het is de 26e. Januari heeft 31 dagen, dus je bent op 26/31 e deel van de maand. Februari heeft 28 dagen (je moet dus wel tracken hoeveel dagen de volgende maand heeft). Je wil dus uitkomen op 26/31 * 28 = 23,48. Afhankelijk van wat je er mee wil kan je daar dan dus een ceil, floor of round op toepassen.

Zin in pizza? Probeer 'mijn' pizzarecept eens! Laatste versie pizzarecept Blog:KookKompas


Acties:
  • 0 Henk 'm!

  • Barleone
  • Registratie: Maart 2009
  • Laatst online: 23:23
Vooreerst: het is niet verboden om je code even van wat commentaar te voorzien, meer eigenlijk: doe dat eens aub. ;)

Als ik je goed begrijp wil je maximaal 1 kalendermaand vooruit tellen? Dat zou betekenen dat je het idee van MaximusTG^ kan gebruiken. Maar wellicht wil je in zijn voorbeeld van de 26e ook de volgende maand op dag 26 houden. Fix daar maar iets voor. ;)

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?


Acties:
  • 0 Henk 'm!

  • MaximusTG
  • Registratie: April 2003
  • Niet online
(overleden)
Wat Barleone zegt kan idd ook. Dan hoog je alleen het getal van de maand op, en vervolgens controleer je of de dag dan nog wel mogelijk is voor de maand die je dan krijgt.
Dus stel idd 31-01, 1 maand erbij. 31-02. Vervolgens een check of dat kan -> nee. Dan verminder je de dag naar het maximaal mogelijke voor die maand.
Het is een beetje afhankelijk van waar dit voor is.
Wat is precies het doel? Iets met uitkeringen, dat is duidelijk ;).

Zin in pizza? Probeer 'mijn' pizzarecept eens! Laatste versie pizzarecept Blog:KookKompas


Acties:
  • 0 Henk 'm!

  • Hawtin
  • Registratie: Januari 2010
  • Laatst online: 10-10-2018
Jullie hebben gelijk. Ik ga mijn code even op de schop nemen. i.v.m. kantooruren heb ik het een beetje afgeraffeld.

Het idee van Barlone was een idee waar ik onderweg naar huis (nee echt :)) ook op kwam; niet een maand erbij optellen, maar het aantal dagen van de maand. Ik wil inderdaad ook de 26ste op de 26ste houden. Als ik het af heb zet ik het in een bruikbare code (met commentaar), want ik heb heel het internet afgestruind en er is nog niemand met hetzelfde probleem geweest.

Acties:
  • 0 Henk 'm!

  • F.West98
  • Registratie: Juni 2009
  • Laatst online: 20-07 03:40

F.West98

Alweer 16 jaar hier

Dus je wil:
een datum ingeven. vars in js die je krijgt zijn dan dag maand en jaar? of 1 hele datum.
wat je zou kunnen doen bij de eerste is gewoon bij de maand de maand2 (tweede vak) optellen.
1 hele datum: splitsen bij de streepjes en dan 3 vars en dan elke var afzonderlijk optellen/doen en dan weer 1 datum van maken?
Het is maar een idee

2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI


Acties:
  • 0 Henk 'm!

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 12-07 17:55
Hawtin schreef op woensdag 02 mei 2012 @ 17:46:
[...]

Via Google kwam ik uit bij de date.js library en moment.js, maar beiden libs geven mij niet de mogelijkheid om een x aantal maanden op een manier dat x ook x blijft. Wat javascript in feite doet is 30.3 dagen toevoegen aan een datum voor zover ik heb begrepen.

;w
Wellicht is http://code.google.com/p/datejs/ toch iets om naar te kijken? (Het is al oud en verkeert volgens de repository in alpha-status, maar) als hij gewoon lijkt te werken moet je hier alles me kunnen wat je wilt. Hij houdt ook wel rekening met schrikkeljaar en het max. aantal dagen voor zo ver ik snel even heb getest.


JavaScript:
1
2
3
4
5
// met alleen core.js:
new Date(Date.parse('31-Jan-2003')).addMonths(1); // geeft Fri Feb 28 2003
new Date(Date.parse('29-Jan-2004')).addMonths(1); // geeft Fri Feb 29 2004
new Date(Date.parse('30-Jan-2004')).addMonths(1); // geeft Fri Feb 29 2004
new Date(Date.parse('15-Feb-2004')).addMonths(1); // geeft Mon Mar 15 2004

[ Voor 24% gewijzigd door C0rnelis op 05-05-2012 01:30 . Reden: originele quote even ingevoegd ]


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

C0rnelis schreef op zaterdag 05 mei 2012 @ 00:37:
JavaScript:
1
2
// met alleen core.js:
new Date(Date.parse('31-Jan-2003')).addMonths(1); // geeft Fri Feb 28 2003
Dan klopt deze dus niet. Die zou dan als datum 3 maart moeten geven.

Acties:
  • 0 Henk 'm!

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 12-07 17:55
CptChaos schreef op zaterdag 05 mei 2012 @ 00:53:
[...]
Dan klopt deze dus niet. Die zou dan als datum 3 maart moeten geven.
Hawtin schreef op woensdag 02 mei 2012 @ 17:46:
[...]

Als je bijvoorbeeld 31-1 hebt en je zou hier via de normale javascript manier
JavaScript:
1
datum.setMonth(datum.getMonth() + maand.value * 1
een maand bij optellen kom je uit op 2-3. Ik moet echter 28-2 of 29-2 hebben, afhankelijk van of het jaar een schrikkeljaar is.

[...]

;w
MaximusTG schreef op woensdag 02 mei 2012 @ 19:02:
[...]
Dus stel idd 31-01, 1 maand erbij. 31-02. Vervolgens een check of dat kan -> nee. Dan verminder je de dag naar het maximaal mogelijke voor die maand.
Het is een beetje afhankelijk van waar dit voor is.
[...]
;)

[ Voor 29% gewijzigd door C0rnelis op 05-05-2012 01:30 ]


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Ja of 3 maart dus, afhankelijk van de hoeveelheid tijd die je er tussen wilt hebben. Kan me voorstellen dat je voor 'iets' namelijk steeds dezelfde hoeveelheid tijd er tussen wilt hebben. Terugkerende afspraken bijvoorbeeld.

[ Voor 9% gewijzigd door CH4OS op 05-05-2012 02:41 ]


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
je kunt toch + 1 maand doen, en dan een while loopje die steeds een dag van je resultaat af trekt totdat de waarde van dag kleiner of gelijk is aan de waarde van de oorspronkelijke dag?

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 20:12

Dido

heforshe

CptChaos schreef op zaterdag 05 mei 2012 @ 02:40:
Ja of 3 maart dus, afhankelijk van de hoeveelheid tijd die je er tussen wilt hebben. Kan me voorstellen dat je voor 'iets' namelijk steeds dezelfde hoeveelheid tijd er tussen wilt hebben. Terugkerende afspraken bijvoorbeeld.
Maar dat had de TS al opgelost en hij stel expliciet dat dat niet is wat ie wil. Waarom er dan op blijven hameren :?

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 15-07 12:31
Als je er gewoon 1 maand bij optelt en je kijkt dan of je op de verwachte dag uitkomt dan weet je gelijk hoeveel de offset is met de dag die je eigenlijk wilt hebben en kan je dat corrigeren.

Heb even opzetje voor je gemaakt:
http://jsfiddle.net/ruRjb/5/

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:43

crisp

Devver

Pixelated

Simpel truukje: Date.setDate(0) zet het datum object op de laatste dag van de vorige maand (lees de specs maar eens ;))

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Date.prototype._addMonths = function(numMonths)
{
    var newMonth = this.getMonth() + numMonths;

    this.setMonth(newMonth);

    if (this.getMonth() != newMonth % 12)
    {
        this.setDate(0);
    }
}

var d = new Date(2012, 0, 31); // 31 januari 2012
d._addMonths(13);
alert(d.toLocaleDateString()); // 28 februari 2013

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 15-07 12:31
Nog mooiere oplossing ;). Wel grappig dat dat in de specs zit :D.
Pagina: 1