web-dev-qa-db-fra.com

Trouver tous les jours d'un mois avec l'objet Date?

y a-t-il un moyen d'avoir tous les jours d'un mois ou d'une année? Je cherche ceci afin de désactiver certains jours dans un datepicker, j'aurais une page dans le back-office pour sélectionner ces jours à désactiver.

Il me faudrait donc afficher tous les jours du mois et ajouter un bouton "Activer ou désactiver" en dessous de chaque jour. Est-il possible de trouver ces jours avec l'objet Date? J'ai trouvé ce lien par exemple: Afficher tous les jours du mois mais je ne le comprends pas vraiment, en plus c'est Java, j'essaie de trouver une solution en javascript.

Merci de votre aide

11
Paul

Pour obtenir une liste de tous les jours du mois, vous pouvez commencer par Date le premier jour du mois, puis l'augmenter jusqu'à ce que le mois change. 

/**
 * @param {int} The month number, 0 based
 * @param {int} The year, not zero based, required to account for leap years
 * @return {Date[]} List with date objects for each day of the month
 */
function getDaysInMonth(month, year) {
     var date = new Date(year, month, 1);
     var days = [];
     while (date.getMonth() === month) {
        days.Push(new Date(date));
        date.setDate(date.getDate() + 1);
     }
     return days;
}

Exemple http://jsfiddle.net/kKj8h/1/

45
Juan Mendes

Je ne suis pas sûr de votre description si le datepicker de dates de désactivation standard fonctionnera avec vous, je vais donc répondre à votre question directement.

Vous pouvez construire assez facilement un tableau de jours pour un mois en procédant comme suit:

var numOfDays = new Date(2012, 10, 0).getDate(); //use 0 here and the actual month
var days = new Array();

//This will construct an array with all the elements represent the day of the week 
//(i.e. Oct 30th would be days[30-1] or days[29]) and the value would be the actual 
//day of the week (i.e. Tuesday which is representing by the number 2)
for(var i=0;i<=numOfDays;i++)
{
    days[i] = new Date(2012,9,i+1).getDay(); //use month-1 here            
}
//This will give you a number from 0 - 6 which represents (Sunday - Saturday)
alert(days[29]); 

En utilisant ce nombre de jours, vous pouvez très bien faire ce que vous voulez et connaître le jour de la semaine.

5
Jeremy Morehouse

J'ai implémenté la fonctionnalité que vous avez demandée à l'aide d'un datepicker jQuery.

Commencez par ajouter toutes les dates sélectionnées dans le back-office à désactiver dans un tableau.

// format yyyy-mm-dd
var disabledDates = [
    "2012-10-01",
    "2012-10-02",
    "2012-10-30",
    "2012-09-12"
];

Deuxièmement, spécifiez le sélecteur de date avec deux fonctions

$("#datepicker").datepicker({

    // only enable date if dateEnabled returns [true]
    beforeShowDay: dateEnabled,

    // once a date has been selected call dateSelected
    onSelect: dateSelected
});

Voici la définition des fonctions requises

function dateEnabled( d ) {

    // if date found in array disable date
    if( disabledDates.indexOf( getDate( d ) ) > -1 ) {

        return [false];

    } else {

        return [true] ;

    }
}  

Convertir la date en chaîne pour la comparaison avec les dates dans un tableau

function getDate( d ) {
    var day,
        month,
        year;

    day = d.getDate( );
    month = d.getMonth( ) + 1; // add 1 as getMonth returns 0 - 11
    year = d.getFullYear( );

    if( month < 10 ) month = "0" + month;
    if( day < 10 ) day = "0" + day;
    return year + "-" + month + "-" + day;
}

Une fois la date sélectionnée, traitez-la

function dateSelected( d ) { 
   // do stuff with string representation of date                                          
}

Voici un violon http://jsfiddle.net/KYzaR/7/

Nous avons juste pensé qu'il serait utile de mentionner qu'Array.indexOf est un ajout récent à la norme ECMA-262 et que, par conséquent, dans le cas d'IE7 et d'IE8, il n'est pas pris en charge. La page MDN suivante fournit du code qui implémente Array.indexOf pour ces navigateurs https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf

1
Bruno

Voici une boucle qui passe tous les mois pour déterminer le dernier jour de ce mois. Objet Javascript Date indexant les mois commençant à zéro et si vous définissez le jour à zéro, il revient au dernier jour du mois précédent Pratique pour déterminer l'année bissextile dernier jour de février

Date( 2012, 12, 0) retournera le 31 décembre 2012

Date (2012,0,0) retournera le 31 décembre 2011

et le tout important de comprendre est février avec 

Date ( 2012,3,0) Renvoie le 29 février depuis une année bissextile cette année

var mos=['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec']

for (i = 0; i < 12; i++) {
    var lastDate = new Date(2012, i+1, 0);
    $('body').append('Last day of ' + mos[i] + ' is ' + lastDate.getDate()+'<br>')
}

DEMO: http://jsfiddle.net/5k8sn/1/

1
charlietfl

Pour désactiver les dates dans un sélecteur de date, vous pouvez utiliser la réponse décrite ici:
https://stackoverflow.com/a/12061715/48082

Pour choisir plusieurs dates (comme dans l'application back-office), vous pouvez utiliser ce plugin:
http://multidatespickr.sourceforge.net/

0
Cheeso