Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Creation d'objets Date , probleme avec fevrier ?

12 réponses
Avatar
xav
Bonjour,

voila ci joint un bout de code de test, quelqu'un peut il m'expliquer
pourquoi lors de la creation d'une date JS a l'aide des setters ,
l'ordre de definition est important ?

l'exemple suivant, devrait a mon avis retourner 3 fois la meme date dans
tous les cas, et bien non, le 3eme retour annonce 1 mois de plus si on
defini une date en fevrier.
C'est moi qui ai 5 trains de retard ? c'est un bug connu ?

Merci d'avance d'éclairer ma lanterne.

Xavier
--------------------------------------------------------------------------
<html>
<head>
<script language="javascript">

function dateFromString(datestring)
{
var parts = datestring.split('-');
var iday = parts[2];
var imonth = parseInt(parts[1]) - 1;
var iyear = parts[0];

var str = '';

str += "init string date is: " + datestring + "\n\n";
str += "Day is: " + iday + ", jsMonth is: " + imonth + ", Year is:
" + iyear + "\n\n";

str += "Date from constructor: " + new Date(iyear, imonth, iday) +
"\n\n";

var d1 = new Date();
d1.setDate(iday);
d1.setMonth(imonth);
d1.setFullYear(iyear);
str += 'Date 1 ok: ' + d1 + "\n\n";

var d2 = new Date();
d2.setFullYear(iyear);
d2.setMonth(imonth);
d2.setDate(iday);

str += 'Date 2 (error?): ' + d2;

alert(str);
}

</script>
</head>
<body
onload="dateFromString('2007-2-14');dateFromString('2007-2-28');
dateFromString('2006-2-14'); dateFromString('2007-1-12');
dateFromString('2007-11-01'); dateFromString('2006-12-24'); ">
</body>
</html>

10 réponses

1 2
Avatar
Saad Saad
Bonjour,

voila ci joint un bout de code de test, quelqu'un peut il m'expliquer
pourquoi lors de la creation d'une date JS a l'aide des setters ,
l'ordre de definition est important ?

l'exemple suivant, devrait a mon avis retourner 3 fois la meme date dans
tous les cas, et bien non, le 3eme retour annonce 1 mois de plus si on
defini une date en fevrier.
C'est moi qui ai 5 trains de retard ? c'est un bug connu ?

Merci d'avance d'éclairer ma lanterne.

Xavier
--------------------------------------------------------------------------
<html>
<head>
<script language="javascript">

function dateFromString(datestring)
{
var parts = datestring.split('-');
var iday = parts[2];
var imonth = parseInt(parts[1]) - 1;
var iyear = parts[0];

var str = '';

str += "init string date is: " + datestring + "nn";
str += "Day is: " + iday + ", jsMonth is: " + imonth + ", Year is: "
+ iyear + "nn";

str += "Date from constructor: " + new Date(iyear, imonth, iday) +
"nn";

var d1 = new Date();
d1.setDate(iday);
d1.setMonth(imonth);
d1.setFullYear(iyear);
str += 'Date 1 ok: ' + d1 + "nn";

var d2 = new Date();
d2.setFullYear(iyear);
d2.setMonth(imonth);
d2.setDate(iday);

str += 'Date 2 (error?): ' + d2;

alert(str);
}

</script>
</head>
<body
onload="dateFromString('2007-2-14');dateFromString('2007-2-28');
dateFromString('2006-2-14'); dateFromString('2007-1-12');
dateFromString('2007-11-01'); dateFromString('2006-12-24'); ">
</body>
</html>


Salut,

Chez moi tout est ok,
il affiche bien 3 fois la même date

Avatar
Francis Spiesser
Saad Saad avait énoncé :


Salut,

Chez moi tout est ok,
il affiche bien 3 fois la même date


Pareil. Je te conseille toutefois, pour éviter des mauvaises surprises,
de remplacer :

var imonth = parseInt(parts[1]) - 1;
par
var imonth = parseInt(parts[1],10) - 1;

--
______
Francis (enlever .NIPUBNISOUMIS)
"La dinde est tolérante, mais elle déteste les farceurs"

Avatar
xav
Saad Saad avait énoncé :


Salut,

Chez moi tout est ok,
il affiche bien 3 fois la même date


Pareil. Je te conseille toutefois, pour éviter des mauvaises surprises,
de remplacer :

var imonth = parseInt(parts[1]) - 1;
par
var imonth = parseInt(parts[1],10) - 1;

Salut, et merci de vos reponses, je viens de retester mon script today,

et effectivement, pas d'erreur, par contre, alors ca semble encore plus
vicieux que ca...
le jour ou j'ai fais ces tests, j'avais modifié l'horloge de mon windows
a la date du 29/12/2006, si maintenant, je remodifie ma date systeme
pour une date superieure au 28/12/2006 alors le bug reapparait...

Pouvez vous essayer de modifier la date windows et me dire si vous avez
le meme comportement ?

A+
xavier


Avatar
Olivier Miakinen

voila ci joint un bout de code de test, quelqu'un peut il m'expliquer
pourquoi lors de la creation d'une date JS a l'aide des setters ,
l'ordre de definition est important ?

l'exemple suivant, devrait a mon avis retourner 3 fois la meme date dans
tous les cas, et bien non, le 3eme retour annonce 1 mois de plus si on
defini une date en fevrier.
C'est moi qui ai 5 trains de retard ? c'est un bug connu ?


:-D

C'est très logique, si le jour où tu as fait le test était un 29, 30 ou
31 du mois !

Merci d'avance d'éclairer ma lanterne.


Supposons que c'était le 30 mai dernier, et voyons ce que fait ton code,
par exemple pour le 14 février 2007.

var d2 = new Date();


d2 = 30 mai 2006

d2.setFullYear(2007);


d2 = 30 mai 2007

d2.setMonth(2);


d2 = 30 février 2007

Mais comme en 2007 le mois de février n'aura que 28 jours, la date est
recalculée :

d2 = 2 mars 2007

d2.setDate(14);


d2 = 14 mars 2007

Et voilà !



Note que ton deuxième code présente le même genre de problème, mais pour
d'autres dates. Par exemple, si tu veux mettre une date au 31 décembre
2007 alors que la date courante est le 30 juin 2006 :

var d1 = new Date();


d1 = 30 juin 2007

d1.setDate(31);


d1 = 31 juin 2006

Mais comme le mois de juin ne compte que 30 jours, la date est recalculée :

d1 = 1er juillet 2006

d1.setMonth(12);


d1 = 1er décembre 2006

d1.setFullYear(2007);


d1 = 1er décembre 2007

Ce coup-ci, c'est le jour du mois qui est mauvais.


Cordialement,
--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
Francis Spiesser
Olivier Miakinen a exposé le 26/06/2006 :
C'est très logique, si le jour où tu as fait le test était un 29, 30 ou
31 du mois !

Merci d'avance d'éclairer ma lanterne.


Supposons que c'était le 30 mai dernier, et voyons ce que fait ton code,
par exemple pour le 14 février 2007.

var d2 = new Date();


d2 = 30 mai 2006

d2.setFullYear(2007);


d2 = 30 mai 2007

d2.setMonth(2);


d2 = 30 février 2007

Mais comme en 2007 le mois de février n'aura que 28 jours, la date est
recalculée :

d2 = 2 mars 2007

d2.setDate(14);


d2 = 14 mars 2007

Et voilà !


J'aillais le dire mais mon message a été refusé parce que j'avais
oublié de me remettre à la bonne date ;-)

--
______
Francis (enlever .NIPUBNISOUMIS)
"Tout corps plongé dans la baignoire fait sonner le téléphone"


Avatar
Olivier Miakinen

J'allais le dire mais mon message a été refusé parce que j'avais
oublié de me remettre à la bonne date ;-)


:-D

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
Cenekemoi
C'est très logique, si le jour où tu as fait le test était un 29, 30
ou 31 du mois !

Merci d'avance d'éclairer ma lanterne.


Supposons que c'était le 30 mai dernier, et voyons ce que fait ton
code, par exemple pour le 14 février 2007.

var d2 = new Date();


d2 = 30 mai 2006

d2.setFullYear(2007);


d2 = 30 mai 2007

d2.setMonth(2);


d2 = 30 février 2007


non, non, le paramètre de "setMonth()" va de 0 à 11 ! Il en est de même,
d'ailleurs pour "getMonth()". Donc :

d2 = 30 mars 2007

d'où le :

d2 = 14 mars 2007 ensuite...


Note que ton deuxième code présente le même genre de problème, mais
pour d'autres dates. Par exemple, si tu veux mettre une date au 31
décembre 2007 alors que la date courante est le 30 juin 2006 :

var d1 = new Date();


d1 = 30 juin 2007

d1.setDate(31);


d1 = 31 juin 2006

Mais comme le mois de juin ne compte que 30 jours, la date est
recalculée :

d1 = 1er juillet 2006


Là nous sommes bien d'accord...

d1.setMonth(12);

d1 = 1er décembre 2006


Je pencherais plus pour :

d1 = 1er janvier 2006 (ou 2007)

Ceci dit, Olivier a parfaitement raison quand au fait que, par exemple,
un "32 janvier" donnera un 1er février !

D'où l'algo (béton) suivant que j'utilise pour vérifier qu'une date est
valide :

<script>
function isDateValide(Year,Month,Day) {
var dDate=new Date(Year,Month-1,Day);
return ( dDate.getFullYear()==Year && dDate.getMonth()==Month-1 &&
dDate.getDate()=Úy )
}

</script>

simple, mais très efficace...

--
Cordialement, Thierry ;-)


Avatar
Olivier Miakinen

d2.setMonth(2);


d2 = 30 février 2007


C'était bien sûr setMonth(1) pour le mois de février (pareil pour mon
deuxième exemple). Mais bon, tu avais correctement fait « - 1 » dans ton
code et ton problème ne venait pas de là.

Mais comme en 2007 le mois de février n'aura que 28 jours, la date est
recalculée :


Je précise que ceci n'est pas un bug, et qu'il peut être très utile de
pouvoir préciser des numéros de jours ou de mois en dehors des plages
normales. Par exemple, tu peux ainsi calculer la date qu'il sera dans 7
jours ou dans 14 jours, ou bien la date qu'il était il y a deux mois.
Au passage, un moyen parmi tant d'autres pour savoir si une année est
bissextile ou non, c'est de construire la date du 0 mars de l'année,
puis de voir après recalcul si c'est le 28 ou le 29 février.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)


Avatar
xav

C'est très logique, si le jour où tu as fait le test était un 29, 30 ou
31 du mois !


Yep...


Merci de vos reponses, c'est vrai que finalement c'est trés logique...
je n'y avais pas pensé.

A+
xavier


Avatar
Dr John Stockton
JRS: En article <449f8ca9$0$1029$, datee Mon,
26 Jun 2006 09:28:38 remote, vu en news:fr.comp.lang.javascript, xav

voila ci joint un bout de code de test, quelqu'un peut il m'expliquer
pourquoi lors de la creation d'une date JS a l'aide des setters ,
l'ordre de definition est important ?


C'est important, si la methode est mauvaise.

Lisez s.v.p. <URL:http://www.jibbering.com/faq/> et mes pages
<URL:http://www.merlyn.demon.co.uk/js-dates.htm> ff. et aussi
<URL:http://www.merlyn.demon.co.uk/js-index.htm> ff. ?


var imonth = parseInt(parts[1]) - 1;


Si parts[1] est '08' ou '09', imonth sera -1. On peut utiliser
parseInt(X, 10), ou

var imonth = '08' - 1; // OK


Souvent, pour X etant String, apres X = +x X sera un Number.

--
© John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 IE 4 ©
<URL:http://www.jibbering.com/faq/>? JL/RC: FAQ of news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.

1 2