获取月份的最后一天 - 输出与预期不同

时间:2018-02-17 22:49:25

标签: javascript

我在Stack Overflow上搜索并查看了这个问题的答案。但是出于一些奇怪的原因或者可能升级到可以升级的任何东西。当我在JavaScript中使用Date(2018,2,0)时,这将检索2月的最后一天。但是我检查了所有的答案,为了得到二月的最后一天,我应该写一下:Date(2018,3,0)

我的问题基本上就是这个。我是否错过了一些东西,以获得多年前使用的功能的不同输出与检索第0天的最后一天的技巧?我的服务器的日期还可以,时区非常好。那么为什么我的输出与我迄今为止针对同一个问题看到的所有答案的输出不同呢?

好的,这是我想要的代码:

// Load calendar days in a TR element
function ShowCalDays(TableId,cyear,cmonth,clickable = "") {
  var curm = parseInt(cmonth,10);
  var cury = parseInt(cyear,10);
  var curd = 0;
  var curw = 0;
  var ictr = 0;
  var trdata = "";
  var newweek = "";
  var cal_tab = document.getElementById(TableId);
  var cal_tr = 0;
  var cal_td = 0;
  var cal_txt = 0;
  var cal_weeks = document.getElementById("week");

  // Delete all week days to refresh calendar
  while (cal_weeks) {
    cal_weeks.parentNode.removeChild(cal_weeks);
    cal_weeks = document.getElementById("week");
  }

  // Last day
  var ldt = new Date(cury,curm,0);
  // First day
  var fdt = new Date(parseInt(cyear,10),parseInt(cmonth,10),1);
  // Retrieve last day of month
  curd = ldt.getDate();
  // Get week day number
  curw = fdt.getDay();

  cury = 0;
  cal_tr = document.createElement("tr");
  cal_tab.appendChild(cal_tr);
  // Loop all days of the month and build days table
  for (ictr=0 - curw;ictr<=curd;ictr++) {
    newweek = "";
    cury++;
    cal_td = document.createElement("td");
    if (clickable == "y" && ictr > 0) {cal_td.style.cursor = "pointer";}
    // Set new week row
    if (cury > 7)   {cal_tr = document.createElement("tr");}
    // Set TD value
    if (ictr > 0) {newweek = ictr.toString();}
    // Create td and tr element AND insert text inside
    cal_txt = document.createTextNode(newweek);
    cal_td.appendChild(cal_txt);
    cal_tr.appendChild(cal_td);
    cal_tr.id = "week";
    if (cury > 7){
        cal_tab.appendChild(cal_tr);
        cury = 1;
    }
  }
}

3 个答案:

答案 0 :(得分:1)

Per the MDN documentation

  

注意:参数month从0开始。这意味着January = 0December = 11

所以new Date(2018, 2, 0)创建一个日期 - 三月的第0天,或二月的最后一天。 Firefox不是错的&#39;在这种情况下,其他浏览器不应采取任何不同的行动,因为这是标准化的行为。

答案 1 :(得分:0)

我终于解决了这个问题。在考虑了0基础答案之后。我再看看我的代码并改变了一些东西来重试整个工作,因为它的目的。和往常一样,我的不好,我错过了一个小信息。非常感谢您的支持人员。

所以这里是最终的代码更正和功能。

// Load calendar days in a TR element
function ShowCalDays(TableId,cyear,cmonth,clickable = "") {
  var curm = parseInt(cmonth,10);
  var cury = parseInt(cyear,10);
  var curd = 0;
  var curw = 0;
  var ictr = 0;
  var trdata = "";
  var newweek = "";
  var cal_tab = document.getElementById(TableId);
  var cal_tr = 0;
  var cal_td = 0;
  var cal_txt = 0;
  var cal_weeks = document.getElementById("week");

  // Delete all week days to refresh calendar
  while (cal_weeks) {
    cal_weeks.parentNode.removeChild(cal_weeks);
    cal_weeks = document.getElementById("week");
  }

  // If month is december, set next month as January of next year
  // to retrieve last day of december
  if (curm == 12) {
    curm = 0;
    cury += 1;
  }

  // Last day
  var ldt = new Date(cury,curm,0);
  // First day
  var fdt = new Date(parseInt(cyear,10),parseInt(cmonth,10)-1,1);
  // Retrieve last day of month
  curd = ldt.getDate();
  // Get week day number
  curw = fdt.getDay();

  cury = 0;
  cal_tr = document.createElement("tr");
  cal_tab.appendChild(cal_tr);
  // Loop all days of the month and build days table
  for (ictr=1 - curw;ictr<=curd;ictr++) {
    newweek = "";
    cury++;
    cal_td = document.createElement("td");
    if (clickable == "y" && ictr > 0) {cal_td.style.cursor = "pointer";}
    // Set new week row
    if (cury > 7)   {cal_tr = document.createElement("tr");}
    // Set TD value
    if (ictr > 0) {newweek = ictr.toString();}
      // Create td and tr element AND insert text inside
      cal_txt = document.createTextNode(newweek);
      cal_td.appendChild(cal_txt);
      cal_tr.appendChild(cal_td);
      cal_tr.id = "week";
      if (cury > 7){
        cal_tab.appendChild(cal_tr);
        cury = 1;
    }
  }
}

答案 2 :(得分:-2)

  

我的服务器的日期还可以,时区非常好

由于javascript是客户端脚本语言,除非您使用NodeJS之类的东西在服务器上运行javascript代码,否则服务器上的日期和时区并不相关。相关的是客户的日期和时区。