138 messaggi dal 05 maggio 2005
Ciao a tutti!

Ho scritto una funzione Javascript che dovrebbe aggiungere n mesi ad una data.

Il codice è questo:

dts = new Date(strYear,strMonth,strDay);
dts.setMonth(dts.getMonth() + parseInt(m.value));

var day = dts.getDate();
var mm = dts.getMonth() + 1;
var yyyy = dts.getFullYear();

La funzione sembra fare il suo dovere nella maggior parte dei casi.

Ma se, per esempio, passo questi valori:
strYear=2009
strMonth=1
strDay=31

m.value=1

invece di ottenere 28/02/2009 ottengo 03/03/2009

Mi aiutate a capire come risolvere il problema?

Grazie,
Atropo
Modificato da Atropo il 18 giugno 2009 11.59 -
Atropo ha scritto:
invece di ottenere 28/02/2009 ottengo 03/03/2009

mi sembra il comportamento corretto: se parti da 31/01/2009 e al mese sommi 1 ottieni 31/02/2009 che ovviamente corrisponde al 3 marzo (nel 2009, al 2 negli anni bisestili)

Mi aiutate a capire come risolvere il problema?

IMHO quello non è un problema ma il comportamento auspicabile. Dovresti chiarire il concetto di "sommare un mese" che può voler dire "aggiungere 30 giorni" oppure altra logica. Nel tuo caso dovresti implementarti del codice che:
1) capisca se la data di partenza è superiore al numero massimo di giorni ammessi per il mese successivo; tanto per intenderci se la data è il 28/29/30/31 gennaio, il 31 marzo, il 31 maggio, il 31 agosto o il 31 ottobre (in tutti gli altri giorni il problema non esiste)
2) nei suddetti casi ti posizioni sull'ultimo giorno utile del mese successivo

HTH

Matteo Casati
GURU4.net
138 messaggi dal 05 maggio 2005
m.casati ha scritto:
Atropo ha scritto:
invece di ottenere 28/02/2009 ottengo 03/03/2009

mi sembra il comportamento corretto: se parti da 31/01/2009 e al mese sommi 1 ottieni 31/02/2009 che ovviamente corrisponde al 3 marzo (nel 2009, al 2 negli anni bisestili)

Mi aiutate a capire come risolvere il problema?

IMHO quello non è un problema ma il comportamento auspicabile. Dovresti chiarire il concetto di "sommare un mese" che può voler dire "aggiungere 30 giorni" oppure altra logica. Nel tuo caso dovresti implementarti del codice che:
1) capisca se la data di partenza è superiore al numero massimo di giorni ammessi per il mese successivo; tanto per intenderci se la data è il 28/29/30/31 gennaio, il 31 marzo, il 31 maggio, il 31 agosto o il 31 ottobre (in tutti gli altri giorni il problema non esiste)
2) nei suddetti casi ti posizioni sull'ultimo giorno utile del mese successivo

HTH


Grazie per la risposta. Mi aspettavo un comportamento simile ad addMonth...
In parole povere io ho una data decorreza ed i mesi contratto e devo calcolare la data di fine contratto.

Quindi l'unica soluzione è scrivere il codice che gestisca la situazione perchè in JS non c'è nulla che funzioni come addMonth di .Net,giusto?

Ciao!
Atropo ha scritto:
Quindi l'unica soluzione è scrivere il codice che gestisca la situazione perchè in JS non c'è nulla che funzioni come addMonth di .Net,giusto?

Esatto. Si tratta comunque di poche righe di script.

Matteo Casati
GURU4.net
138 messaggi dal 05 maggio 2005
m.casati ha scritto:
Atropo ha scritto:
Quindi l'unica soluzione è scrivere il codice che gestisca la situazione perchè in JS non c'è nulla che funzioni come addMonth di .Net,giusto?

Esatto. Si tratta comunque di poche righe di script.


Alla fine ho risolto con questo codice che vi posto caso mai servisse a qualcuno:

dts = new Date(strYear,strMonth,strDay);
var n = dts.getDate();
dts.setDate(1);
dts.setMonth(dts.getMonth() + parseInt(m.value));
dts.setDate(Math.min(n, GetMonthDays(dts.getFullYear(),dts.getMonth())));

var day = dts.getDate();
var mm = dts.getMonth() + 1;
var yyyy = dts.getFullYear();

che richiama questa funzione:

function GetMonthDays(year, month)
{
var remain = year % 4;
return[31,((remain == 0)?29:28),31,30,31,30,31,31,30,31,30,31][month];
}

Ciao e grazie

Atropo

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
In primo piano

I più letti di oggi

Media
In evidenza
MISC