63 votes

datepicker date décalée d'un jour

La date renvoyée par le sélecteur de date est décalée d'un jour. S'agit-il d'un problème dans mon code ou d'un bug ?

La date envoyée à date_picker est 2012-03-21. La date renvoyée par datepicker est Tue Mar 20 2012.

    var end_date = end_calendar.getFormatedDate("%Y-%m-%d");
    end_date = $.datepicker.formatDate('D M dd yy', new Date(end_date));

0 votes

Vous êtes sûr que c'est lié à l'indicateur de date ? document.write(new Date('2012-03-21')) imprime Tue Mar 20 2012 20:00:00 GMT-0400 (Eastern Daylight Time) pour moi. Le bug de l'année bissextile ?

0 votes

Quelque chose à voir avec le formatage aussi, regardez ça : jsfiddle.net/fkSC5 Passing 2012-03-21 et 2012/03/21 à Date() donne des résultats à 4 heures d'intervalle.

0 votes

C'est vrai. La nouvelle Date('...') est décalée d'un jour.

33voto

Vega Points 44724

Ce n'est pas le sélecteur de date,

console.log(new Date('2012-03-21')); //prints Tue Mar 20 2012 20:00:00 GMT-0400 (Eastern Daylight Time)

Le Javascript Date peut accepter une des syntaxes suivantes comme ci-dessous,

  1. nouvelle date()
  2. nouvelle Date(millisecondes)
  3. nouvelle date(dateString)
  4. nouvelle Date(année, mois, jour [, heure, minute, seconde, milliseconde ])

Donc, dans votre cas, il va appeler la dateString et analyser . Essayez donc d'ajouter l'heure comme ci-dessous,

new Date ('2012-03-21T00:00:00') //should return you Wed Mar 21 2012

DEMO

ou Mieux utiliser comme ci-dessous,

new Date (2012, 2, 21). 

année - Valeur entière représentant l'année. Pour des raisons de compatibilité (afin d'éviter le problème du passage à l'an 2000), vous devez toujours spécifier l'année en entier ; utilisez 1998, plutôt que 98.

mois - Valeur entière représentant le mois, commençant par 0 pour janvier à 11 pour décembre.

jour - Valeur entière représentant le jour du mois (1-31).

24voto

user823527 Points 3214

Il semble que ce soit un bug. Si la chaîne envoyée à Date() est formatée en 2012/03/21 au lieu de 2012-03-21. La date semble correcte.

22voto

David Points 980

Il ne s'agit pas d'un bogue, mais d'une confusion certaine.

La plupart des réponses de cette page sont confuses et contiennent des informations erronées.

Le vrai problème est dans la façon dont le javascript Date analyse les chaînes de dates.

La meilleure réponse que j'ai trouvée est cette réponse de stack-O . Consultez son excellent article.

Vous trouverez ci-dessous un commentaire très pertinent tiré de la réponse mentionnée ci-dessus. (crédit : @Mizstik)

Tout ceci est dû au comportement de la fonction sous-jacente Date.parse() qui essaie de respecter la norme ISO 8601. Lorsque la chaîne de date suit le format aaaa-mm-jj, elle est supposée être ISO 8601 avec UTC 00:00 implicite. Lorsque la chaîne de caractères s'écarte du format (par exemple mm-dd-yyyy ou un slash au lieu d'un trait d'union), on revient à l'analyseur plus souple selon la RFC 2822 qui utilise l'heure locale lorsque le fuseau horaire est absent. Il est vrai que tout ceci est assez obscur pour une personne moyenne.

13voto

jeremyforan Points 477

Vous pouvez ajouter la différence à la date qui ignorera essentiellement le fuseau horaire.

d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );

2 votes

Merci de votre réponse. stackoverflow.com/questions/32469269/ j'utilise juste le moins - et j'utilise l'heure actuelle pour obtenir le décalage du fuseau horaire comme ceci d.setTime( d.getTime() - new Date().getTimezoneOffset()*60*1000 );

13voto

Michael Points 390

Je ne sais pas pourquoi cela fonctionne, mais j'ai constaté que le fait d'utiliser des barres obliques ou des tirets affecte la réponse. Jetez un coup d'oeil.

new Date ('2012/03/21'); // returns: "Wed Mar 21 2012 00:00:00 GMT-0500 (CDT)"
new Date ('2012-03-21'); // returns: "Tue Mar 20 2012 19:00:00 GMT-0500 (CDT)" WHA!

Pour résoudre mon problème, j'ai donc effectué une simple regex sur ma date d'entrée afin de toujours remplacer les trois premiers tirets par des barres obliques.

var strInputValue = control.value, // <-- get my date string
    dteCurrent;

strInputValue = strInputValue.replace(/-/, '/')  // replace 1st "-" with "/"
                             .replace(/-/, '/'); // replace 2nd "-" with "/"

dteCurrent = new Date(strInputValue);

J'ai fait un très rapide J'ai cherché sur Google pourquoi cela se produisait et je n'ai trouvé aucune réponse. Mais cela devrait résoudre votre problème. Tout ce que vous avez à faire, c'est de remplacer les tirets par des barres obliques avant de les passer à l'endroit voulu.

Edit : désolé, je n'ai pas remarqué la réponse déjà acceptée avant de poster, veuillez ne pas tenir compte de cette réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X