将日历设为2D数组

时间:2019-04-02 10:24:15

标签: javascript

我正在尝试将日历制成HTML表格。它应该是单个2D数组,每行作为一周,每列作为一天。 “周”开始必须为星期一,并且必须有空白用于重叠的月份。

问题在于开始日期每个月都是错误的,并且每次都不同。 2019年1月1日是星期二,所以我希望开始日是2日,但是我得到4日(星期四),同样的问题每隔一个月发生一次。

我正在使用函数来获取当月的天数以及该月的开始日期

function month_days(month, year) {return new Date(year, month, 0).getDate();}
function month_start(month, year) {return new Date(year, month, 0).getDay();}

我的问题是使用month_start函数。

//date is an date object generated on the fly using date.setMonth() and date.setYear();
var month_2D_arr = gen_days(date.getMonth()+1, date.getFullYear());

function gen_days(month, year){
  var monthNames = ["January", "February", "March", "April", "May", "June",  "July", "August", "September", "October", "November", "December"];
  var checking = new Date(year, month, 0);
  console.log(monthNames[checking.getMonth()]);
  console.log(checking.getFullYear());

  var days = mondays(month, year);
  var start = monstart(month, year);
  console.log("start="+start);
}

与假设的输出(“ ||”右侧)相比,输出如下(我手动得出了实际的日期名称)。

    My Results            ||       Actual Days
January = 4 - Thursday    ||   January = 2 - Tuesday
February = 4 - Thursday   ||   February = 5 - Friday
March = 0 - Sunday        ||   March = 5 - Friday
April = 2 - Tuesday       ||   April = 1 -Monday
May = 5 - Friday          ||   May = 3 - Wednesday
June = 0 - Sunday         ||   June = 6 - Saturday
July = 3 - Wednesday      ||   July = 1 - Monday
August = 6 - Saturday     ||   August = 4 - Thursday
September = 1 - Monday    ||   September = 0 - Sunday
October = 4 - Thursday    ||   October = 2 - Tuesday
November = 6 - Saturday   ||   November = 5 - Friday
December = 2 - Tuesday    ||   December = 0 - Sunday

Example console log:
December //(month)
2019     //(year)
start=2  //(start day)

我也将set / getFullYear()切换为set / getYear(),以解决1900年的差异并仍然进行检查。没什么区别。

1 个答案:

答案 0 :(得分:0)

这周开始玩日历,所以我可能会提供一些帮助。

JS将星期日(0)用作一周的第一天,但​​您还想使用星期一(1) 您可以创建一个与任何给定月份的第一天相对应的日期对象,然后从中推断出第一天的星期几。

我采用的方法是创建一个具有7行7列的表。第一行仅包含第th个元素,其日期名称为em。

然后可以将接下来的42个表格单元收集到一个数组中,并为其分配正确的日期。为此,我使用了名字通俗的函数test3创建了一个42个元素的数组。

以下是屏幕: enter image description here

function getFirstDayOfMonth(zeroBasedMonthNum, fullYear)
{
    var monthNames = ['January','Febuary','March','April','May','June','July','August','September','October','November','December'];
    var dateStr = `${monthNames[zeroBasedMonthNum]} 1, ${fullYear}, 00:00:00`;
    var monthStart = new Date( dateStr );
    return monthStart;
}

function daysInMonth(zeroBasedMonthNumber)
{
    var days = [31,28,31,30,31,30, 31,31,30, 31,30,31 ];
    return days[zeroBasedMonthNumber];
}

function MonthDay(number,isThisMonth)
{
    this.day = number;
    this.thisMonth = isThisMonth;
    return this;
}

function test3(monthIndex, year)
{
    var firstDay = getFirstDayOfMonth(monthIndex, year).getDay();
    if (firstDay == 0)
        firstDay = 6;
    else
        firstDay--;

    var daysFromLastMonth = firstDay;
    var result = [];

    var daysInLastMonth = daysInMonth(monthIndex-1);
    var first = daysInLastMonth - daysFromLastMonth + 1;
    console.log(first);
    for (var i=0; i<daysFromLastMonth; i++)
    {
        //result.push(first+i);
        result.push( new MonthDay(first+i, false) );
    }

    for (var i=1; i<= daysInMonth(monthIndex); i++)
        //result.push( i );
        result.push( new MonthDay(i,true) );

    var daysDone = result.length;
    var daysToGo = (6*7) - daysDone;
    for (var i=1; i<=daysToGo; i++)
        //result.push( i );
        result.push( new MonthDay(i,false) );

    return result;
}