web-dev-qa-db-fra.com

datepicker dater d'un jour

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

La date d'envoi à date_picker est le 2012-03-21. La date renvoyée par datepicker est le mar 20 mars 2012.

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

Semble être un bug. Si la chaîne envoyée à Date () est formatée 2012/03/21 au lieu de 2012-03-21. La date semble juste.

19
user823527

Ce n'est pas le datepicker, 

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

L'objet Javascript Date peut accepter l'une des syntaxes suivantes,

  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 les chaînes dateString et parse . Alors essayez d’ajouter l’heure ci-dessous, 

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

DÉMO

ou mieux utiliser comme ci-dessous,

new Date (2012, 2, 21). 

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

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

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

23

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

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

Ce n'est pas un bug, mais certainement déroutant.

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

Le vrai problème réside dans la façon dont l'objet javascript Date analyse les chaînes de date.

La meilleure réponse que j'ai trouvée est cette réponse pile-O . Découvrez son excellent article.

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

Tout cela est dû au comportement du Date.parse () sous-jacent qui tente de suivre ISO 8601. Lorsque la chaîne de date suit le format aaaa-mm-jj, elle est supposée être ISO 8601 avec le code UTC implicite, 00:00. Lorsque la chaîne diffère du format (par exemple, mm-jj-aaaa ou barre oblique au lieu d'un trait d'union), elle revient à l'analyseur plus lâche conformément à la RFC 2822, qui utilise l'heure locale lorsque le fuseau horaire est absent. Certes, tout cela sera assez obscur pour une personne moyenne.

8
David

Je ne sais pas pourquoi cela fonctionne, mais ce que j'ai trouvé, c'est si vous utilisez des barres obliques ou des tirets qui affectent la réponse. Regarde.

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!

Donc, pour résoudre mon problème, j’ai fait une simple expression régulière le jour de ma saisie 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 une recherchevery quickgoogle pour savoir pourquoi cela se produirait et aucune réponse. Mais cela devrait résoudre votre problème. Tout ce que vous avez à faire est de remplacer les tirets par des barres obliques avant de les transmettre où vous le souhaitez.

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

7
Michael

Cela se produit en raison de la différence de fuseau horaire avec le format de la date - aaaa-mm-jj

new Date ('2015/07/10'); // returns: "Fri Jul 10 2015 00:00:00 GMT-0700 (Pacific Daylight Time)"

new Date ('2012-07-10'); // returns: "Thu Jul 09 2015 17:00:00 GMT-0700 (Pacific Daylight Time)" 

yyyy/mm/dd - n’envisage pas le fuseau horaire pour le calcul de l’heure locale.Mais 
yyyy-mm-dd - prend en compte l'heure lors du calcul de l'heure locale dans la fonction de date de script Java.
Cela peut être reproduit lorsque le fuseau horaire du client (navigateur) et celui du serveur sont différents et que le fuseau horaire/la date diffèrent d'un jour. 

Vous pouvez essayer ceci sur votre machine en modifiant l'heure sur différents fuseaux horaires, où l'intervalle de temps n/b doit être supérieur ou égal à 12 heures.

4
Venu M
var myDate = $.datepicker.parseDate("yy-mm-dd", "2013-10-21");
..//do whatever with myDate now
1
Toskan

Après avoir essayé de nombreuses solutions, le code suivant fonctionnait pour moi, extrait de ( https://stackoverflow.com/a/14006555/1736785 )

   function createDateAsUTC(date) {
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}
1
cbyte

vérifiez l'orthographe de .getFormatedDate et modifiez-la en .getFormattedDate

0
scud bomb

Après avoir rencontré le même problème et atterri sur cette page, il s’est avéré, dans mon cas, que cela était dû à un étiquetage incorrect des jours. J'ai commencé la semaine lundi, au lieu de dimanche. J'espère que cela aide quelqu'un.

0
digifrog

Je n'ai pas la réputation de commenter, mais Venu M m'a bien éclairé. Mon projet a le même problème où, en fonction de la syntaxe de ma saisie de date, la date est renvoyée sous forme de saisie ou est désactivée un jour. En élargissant et en regardant le format de date complet, mes différents formats de date d'entrée sont renvoyés au format UTC ou mon fuseau horaire local, en fonction de la syntaxe. J'utilise Moment JS pour analyser mes dates, puis renvoyer un objet de date pour validation avec Breeze. J'ai un modal d'entrée ou un tableau dans lequel éditer, je dois donc maintenant m'assurer que les deux sont analysés et validés à l'identique. Je suggère de vérifier que votre objet date est créé de la même manière, quelle que soit sa syntaxe ou son emplacement.

0
torple