Найдите все дни месяца с объектом Date?

Есть ли способ иметь все дни месяца или года? Я ищу это, чтобы отключить некоторые конкретные дни в datepicker, у меня будет страница в бэк-офисе, чтобы выбрать эти дни для отключения.

Итак, мне нужно будет показывать все дни в месяце и добавлять каждую кнопку "активировать или деактивировать". Есть ли способ найти эти дни с объектом Date? Я нашел эту ссылку, например: Отображение всех дней месяца, но я действительно не понимаю, плюс это Java, я пытаюсь найти решение в JavaScript.

Спасибо за помощь

Ответ 1

Чтобы получить список всех дней в месяце, вы можете начать с Date первого дня месяца, увеличивая день до изменения месяца.

/**
 * @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(Date.UTC(year, month, 1));
     var days = [];
     while (date.getMonth() === month) {
        days.push(new Date(date));
        date.setDate(date.getDate() + 1);
     }
     return days;
}

Ответ 2

Я не уверен в вашем описании, если стандартная функция отключения даты datepicker будет работать с вами, поэтому я отвечу прямо на ваш вопрос.

Вы можете построить массив дней в течение месяца довольно легко, выполнив следующее:

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]); 

Используя этот массив дней, вы можете в значительной степени делать все, что хотите, и знать день недели.

Ответ 3

Здесь цикл, который проходит через каждый месяц, чтобы определить последний день этого месяца. Индексы объектов Javascript Date начинаются с нуля, и если вы установите день на ноль, он возвращается к последнему дню предыдущего месяца. Удобный для определения високосного года в последний день февраля

Date( 2012, 12, 0) вернется 31 декабря 2012 г.

Date (2012,0,0) вернется 31 декабря 2011 года

и все, что нужно выяснить, - февраль с

Date ( 2012,3,0) Возвращает 29 февраля с високосного года в этом году

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/

Ответ 4

Я реализовал запрошенные вами функции с помощью jQuery datepicker.

Сначала добавьте все даты, выбранные в бэк-офис, чтобы их можно было отключить в массив

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

Во-вторых, укажите datepicker с двумя функциями

$("#datepicker").datepicker({

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

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

Вот определение требуемых функций

function dateEnabled( d ) {

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

        return [false];

    } else {

        return [true] ;

    }
}  

Преобразование даты в строку для сравнения с датами в массиве

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;
}

Как только дата была выбрана, процесс

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

Вот скрипка http://jsfiddle.net/KYzaR/7/

Просто подумал, что стоит упомянуть, что Array.indexOf является недавним дополнением к стандарту ECMA-262, поэтому в случае с IE7 и IE8 он не поддерживается. Следующая страница MDN предоставляет код, который реализует Array.indexOf для этих браузеров https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf

Ответ 5

Чтобы отключить даты в datepicker, вы можете использовать ответ, описанный здесь:
fooobar.com/questions/597349/...

Чтобы выбрать несколько дат (например, в приложении back-office), вы можете использовать этот плагин:
http://multidatespickr.sourceforge.net/

Ответ 6

Один лайнер, чтобы получить все дни как объект Date в месяце

const getDaysInMonth = (month, year) => (new Array(31)).fill('').map((v,i)=>new Date(year,month-1,i+1)).filter(v=>v.getMonth()===month-1)