使用Date对象查找一个月内的所有日期?

时间:2012-10-30 19:37:00

标签: javascript jquery date datepicker monthcalendar

有没有办法让一个月或一年的所有日子都有?我正在寻找这个以禁用日期选择器中的某些特定日期,我会在后台有一个页面来选择这些天来禁用。

所以我需要在一个月内显示所有日子,并在每天下方添加“激活或取消激活”按钮。有没有办法用Date对象找到这些日子?我发现这个链接例如:Displaying all the days of a month 但我真的不明白它,加上它是Java,我试图在javascript中找到一个解决方案。

感谢您的帮助

7 个答案:

答案 0 :(得分:48)

要获取一个月中所有日期的列表,您可以在一个月的第一天以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(year, month, 1);
     var days = [];
     while (date.getMonth() === month) {
        days.push(new Date(date));
        date.setDate(date.getDate() + 1);
     }
     return days;
}

示例http://jsfiddle.net/kKj8h/1/

答案 1 :(得分:5)

我不能从您的描述中确定标准禁用日期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]); 

使用这一天你几乎可以用它做任何你想做的事情,也知道一周的日子。

答案 2 :(得分:1)

这是一个每月运行一次的循环,以确定该月的最后一天。 Javascript日期对象将从零开始的月份编入索引,如果将日期设置为零,则会将其恢复为上个月的最后一天。方便确定2月最后一天的闰年

Date( 2012, 12, 0)将于2012年12月31日返回

Date (2012,0,0)将于2011年12月31日返回

并且最重要的一个是2月份

Date ( 2012,3,0)从今年闰年开始返回2月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/

答案 3 :(得分:1)

我已经使用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

答案 4 :(得分:0)

要禁用日期选择器中的日期,您可以使用此处描述的答案:
https://stackoverflow.com/a/12061715/48082

要选择多个日期(如在后台应用程序中),您可以使用此插件:
http://multidatespickr.sourceforge.net/

答案 5 :(得分:0)

一个班轮将一个月中的所有日期作为日期对象

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

答案 6 :(得分:0)

我有一个解决方案。快乐编码❤️ !! 注:0=1 月,1=2 月等。 example w3schools

const getDays = (month, year) => {
    let date = new Date(`${year}-${parseInt(month)+1}-01`);
    let days = [];
    while (date.getMonth() === parseInt(month)) {
        days.push(date.getDate());
        date.setDate(date.getDate() + 1);
    }
    return days;
}