30

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

所以我需要显示一个月中的所有日子,并在每天下方添加一个“激活或停用”按钮。有没有办法用 Date 对象找到这些日子?例如,我找到了这个链接:显示一个月的所有日子,但我不太明白,加上它是 Java,我正在尝试在 javascript 中找到解决方案。

感谢您的帮助

4

10 回答 10

95

要获取一个月中所有天的列表,您可以从一个月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;
}

UTC 版本

为了回应一些评论,我创建了一个使用 UTC 方法的版本,以防您想要调用 UTC 方法而不是返回本地化时区的标准方法。

我怀疑这是评论说这不起作用的罪魁祸首。getUTCMonth/Day/Hours如果您使用 实例化它,您通常希望确保调用方法Date.UTC,反之亦然,除非您尝试转换时区并显示差异。

function getDaysInMonthUTC(month, year) {
  var date = new Date(Date.UTC(year, month, 1));
  var days = [];
  while (date.getUTCMonth() === month) {
    days.push(new Date(date));
    date.setUTCDate(date.getUTCDate() + 1);
  }
  return days;
}

编辑此答案

如果您认为此脚本有问题,请随时:

  • 首先查看下面的现有单元测试
  • 编写一个测试用例来证明它已损坏。
  • 修复代码,确保现有测试通过。

单元测试

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

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

const days2020 = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
const days2021 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

describe("getDaysInMonthUTC", function() {
  it("gets day counts for leap years", function() {
    const actual = days2020.map(
      (day, index) => getDaysInMonthUTC(index, 2020).length
    );
    expect(actual).toEqual(days2020);
  });

  it("gets day counts for non-leap years", function() {
    const actual = days2021.map(
      (day, index) => getDaysInMonthUTC(index, 2021).length
    );
    expect(actual).toEqual(days2021);
  });
});


describe("getDaysInMonth", function() {
  it("gets day counts for leap years", function() {
    const actual = days2020.map(
      (day, index) => getDaysInMonth(index, 2020).length
    );
    expect(actual).toEqual(days2020);
  });

  it("gets day counts for non-leap years", function() {
    const actual = days2021.map(
      (day, index) => getDaysInMonth(index, 2021).length
    );
    expect(actual).toEqual(days2021);
  });
});

// load jasmine htmlReporter
(function() {
  var env = jasmine.getEnv();
  env.addReporter(new jasmine.HtmlReporter());
  env.execute();
}());
<script src="https://cdn.jsdelivr.net/jasmine/1.3.1/jasmine.js"></script>
<script src="https://cdn.jsdelivr.net/jasmine/1.3.1/jasmine-html.js"></script>
<link href="https://cdn.jsdelivr.net/jasmine/1.3.1/jasmine.css" rel="stylesheet"/>

于 2012-10-30T20:07:28.563 回答
8

一个班轮在一个月内将所有天都作为 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)
于 2019-07-08T11:35:47.330 回答
4

根据您的描述,我不确定标准禁用日期日期选择器是否适用于您,因此我将直接回答您的问题。

通过执行以下操作,您可以相当容易地构建一个月的天数数组:

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

使用这一系列的日子,你几乎可以用它做任何你想做的事情,并且还知道一周中的哪一天。

于 2012-10-30T20:00:03.133 回答
2

使用 ES6 数组初始化器

您可以获取指定月份的天数,然后创建一个具有该长度的新数组,并将每一天作为项目。

const getAllDaysInMonth = (month, year) =>
  Array.from(
    { length: new Date(year, month, 0).getDate() },
    (_, i) => new Date(year, month - 1, i + 1)
  );

堆栈片段中的演示

const getAllDaysInMonth = (month, year) =>
  Array.from(
    {length: new Date(year, month, 0).getDate()}, // get next month, zeroth's (previous) day
    (_, i) => new Date(year, month - 1, i + 1)    // get current month (0 based index)
  );

const allDatesInOctober = getAllDaysInMonth(10, 2021)

console.log(allDatesInOctober.map(x => x.toLocaleDateString([], { month: "short", day: "numeric" })))

// ['Oct 1', 'Oct 2', 'Oct 3', 'Oct 4', 'Oct 5', 'Oct 6', 'Oct 7', 'Oct 8', 'Oct 9', 'Oct 10', 'Oct 11', 'Oct 12', 'Oct 13', 'Oct 14', 'Oct 15', 'Oct 16', 'Oct 17', 'Oct 18', 'Oct 19', 'Oct 20', 'Oct 21', 'Oct 22', 'Oct 23', 'Oct 24', 'Oct 25', 'Oct 26', 'Oct 27', 'Oct 28', 'Oct 29', 'Oct 30', 'Oct 31']

于 2021-09-06T18:14:45.890 回答
1

这是一个贯穿每个月的循环,以确定该月的最后一天。Javascript Date 对象索引从零开始的月份,如果将日期设置为零,它将恢复到上个月的最后一天。方便确定 2 月的闰年最后一天

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

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

最重要的是要弄清楚二月

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>')
}

演示:http: //jsfiddle.net/5k8sn/1/

于 2012-10-30T20:11:05.807 回答
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

于 2012-10-30T23:32:04.637 回答
0

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

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

于 2012-10-30T19:43:58.457 回答
0

我有一个解决方案。快乐编码❤️ !! 注意:0=1 月,1=2 月等。 例如 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;
}
于 2021-03-19T11:30:49.407 回答
0

你为什么不把一个月中的所有日子都放在这样的数组中。

 const getDaysInMonth = (month,year,index=1,result=[]) =>{
            const date = new Date(year,month,index)
            return month == date.getMonth() ? getDaysInMonth(month,year,index+1,[...result,date]) : result
        }

然后数他们

const countDaysOfMonth = daysInMonth => daysInMonth.reduce((acc,value) => acc+1 ,0)

然后使用 Math.ceil 7 将总数除以得到周数的行数

const countWeeksInMonth = numberOfDays => Math.ceil(numberOfDays / 7)
于 2021-10-18T22:05:25.963 回答
0

这部分“新日期(年,月,0)”将获得一个月的最后一天,因此您只需从这一天开始迭代,创建从 1 到最后一天的所有天。

public getAllDaysOfMonth(year:number, month: number){
   const lastDayOfMonth = new Date(year, month , 0).getDate();
   for (let i = 1; i < lastDayOfMonth + 1; i++) {
     console.log('day', new Date(year, month - 1, i)) //Here will print all days
   }
}
于 2022-01-26T23:40:05.937 回答