2010-10-11 4 views
2

Je rencontre un problème lorsque je travaille avec des objets de date javascript, en particulier, lorsque j'essaie d'ajouter un jour à un objet date. La fonction que j'écris prend une date de début et crée une liste des sept prochains jours, utilisés comme en-têtes d'une application de calendrier "vue de la semaine". Lorsque les dates de la semaine qu'il détermine sont dans le même mois, ma fonction fonctionne comme prévu. Quand on passe au mois suivant, les choses se gâtent.ajouter un jour à une date javascript l'objet ne fonctionne pas lors du passage au mois suivant

Ma liste date fonction de génération (REMARQUE: la méthode .toHdr() est une méthode de date personnalisée que j'ai créé, comme .clone()):

getWeekDates : function(date){         
    /*               
    * Given a date object, returns a list of dates strings that 
    * become the header of the week view      
    */               
    var _d = date.clone(), dates = [];       
    for(var i=1; i<=7; i++){          
     dates.push(_d.toHdr());         
     _d.setDate(date.getDate() + i);       
    }                    
    return dates;            
}  

Lorsque la date passée à cette fonction est quelque chose comme « lundi 11 Octobre » (comme un objet de date), la fonction ci-dessus retours:

["Monday - Oct. 11, 2010", "Tuesday - Oct. 12, 2010", "Wednesday - Oct. 13, 2010", "Thursday - Oct. 14, 2010", "Friday - Oct. 15, 2010", "Saturday - Oct. 16, 2010", "Sunday - Oct. 17, 2010"] 

Cependant, lorsqu'il est passé une date comme « dimanche 31 Octobre », la liste renvoyée ressemble:

["Sunday - Oct. 31, 2010", "Monday - Nov. 1, 2010", "Friday - Dec. 3, 2010", "Monday - Jan. 3, 2011", "Friday - Feb. 4, 2011", "Tuesday - Mar. 8, 2011", "Wednesday - Apr. 6, 2011"] 

Évidemment, ajouter un jour à la fois à un objet date devient problématique lorsque vous passez à un autre mois, je ne suis pas sûr de savoir comment le contourner. Des idées?

EDIT:

Date.prototype.toHdr = function(){ 
    /* 
    * Convenience method for creating a formatted string that will be used in 
    * all headers with a specific date. 
    */ 
    var dayMapping = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']; 
    var monthMapping = ['Jan.','Feb.','Mar.','Apr.','May','June','July','Aug.','Sept.','Oct.','Nov.','Dec.']; 
    return dayMapping[this.getDay()] + ' - ' + monthMapping[this.getMonth()] + ' ' + this.getDate() + ', ' + this.getFullYear(); 

};

Date.prototype.clone = function(){ 
    /* 
    * Clone a date object, useful for creating a copy of a date, so the 
    * original isn't modified. 
    */ 
    return new Date(this.getTime()); 
} 
+0

Merci Matt, je vais donner un coup d'oeil que lib. – Greg

Répondre

2

intérieur de la boucle que vous utilisez la fourni date comme point de référence pour chaque setDate():

_d.setDate(date.getDate() + i); 

Quand date est le dernier jour d'Octobre (31), et i est 1, ceci place _d jour du mois au 32ème - c.-à-d. le 1er novembre. Lors de la prochaine itération, vous définissez le jour du mois de _d sur (31 + 2), mais rappelez-vous que _d est maintenant novembre - la date passe donc au 3 décembre. Dans les itérations suivantes, votre taille de pas augmente d'un jour supplémentaire chaque mois, d'où votre résultat. Pourriez-vous appeler le getter au lieu de _d? Dans ce cas, au lieu de définir le jour du mois sur 32,33,34, etc., vous devez définir 32, puis 2, 3 et ainsi de suite.

+0

Ah, super observation. Je suis juste en train de modifier l'objet de date passé, et en ajoutant 1 à chaque fois. Cela semble faire l'affaire. Merci pour votre contribution! Très appréciée. – Greg

+0

Un peu nouveau ici, si je voulais poster la solution, devrais-je simplement modifier l'op? Les commentaires ne semblent pas contenir de format. – Greg

+0

@Greg - Je dirais qu'il est préférable de poster la solution comme une réponse (C'est bien de répondre à votre propre question par la suite) par souci de clarté. Mais c'est aussi bien d'améliorer la question en ajoutant/corriger - comme vous avez dans ce cas.En général, il est mal vu de changer la question de telle sorte que les réponses affichées jusqu'ici n'ont plus de sens - mieux vaut poster une autre question si nécessaire. hth. –

0

Ancien sujet, mais dans le cas où quelqu'un atteindrait cette page, cette petite fonction pourrait être utile.

Pour inclure la gestion des mois, vous pouvez créer une nouvelle date en utilisant la fonction "getTime()" de la date d'origine et en ajoutant la valeur correspondante du nombre de jours à ajouter.

function addDays(date,addDays) { 
    return new Date(date.getTime() + (addDays*24*60*60*1000)); 
} 

Cordialement